SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 18.10.2011 23:24:45

Andrey66
Участник
Зарегистрирован: 01.04.2011
Сообщений: 7

Group by и limit

Здравствуйте.
Есть данные:
Есть таблица.
1ая таблица - новости
2ая таблица категории новостей.
Связаны они через cat_id.
Есть задача:
Вывести на главной список категорий и у каждой категории по 5 новостей.
Это очень просто сделать, если сначала запросить список категорий, а затем в цикле сделать запрос по 5 новостей для каждой категории. Но это слишком плохо.
Если сделать запрос с left join, то появляется проблема с limit. Если сначала узнать кол-во категорий, а сделать лимит равный "5*кол-во категорий", то в итоге мы можем получить "5*кол-во категорий" новостей одной категории.
Думаю, что тут нужно как-то хитро использовать group by, но не пойму как.
Буду благодарен за советы.
Заранее спасибо.

Неактивен

 

#2 18.10.2011 23:27:00

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Group by и limit

http://sqlinfo.ru/forum/viewtopic.php?id=1742
Смотреть всю тему до конца.

Неактивен

 

#3 19.10.2011 00:05:15

Andrey66
Участник
Зарегистрирован: 01.04.2011
Сообщений: 7

Re: Group by и limit

Спасибо, за ссылку, но я на неё натыкался и не получилось ничего.
Дамп

DROP TABLE IF EXISTS `cats`;
CREATE TABLE `cats` (
  `id` int(2) NOT NULL AUTO_INCREMENT,
  `cat_title` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
insert  into `cats`(`id`,`cat_title`) values (1,'cat1'),(2,'cat2');

DROP TABLE IF EXISTS `news`;
CREATE TABLE `news` (
  `id` int(2) NOT NULL AUTO_INCREMENT,
  `cat_id` int(11) DEFAULT NULL,
  `title` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
insert  into `news`(`id`,`cat_id`,`title`) values (1,1,'news1'),(2,1,'news2'),(3,2,'new3'),(4,2,'new4'),(5,1,'new5'),(6,2,'new6');
 


вот запрос
SET @n=2, @i=0, @p=0;
SELECT * FROM cats JOIN news ON cats.id=news.cat_id
WHERE IF(@p=cats.id, @i:=@i+1,(@i:=0) OR (@p:=cats.id)) AND @i<@n;


Пробовал запрос всяко-разно менять - не работает. sad
Выдает все новости, вместо двух из каждой категории.

Неактивен

 

#4 19.10.2011 00:23:11

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Group by и limit

Тему все же следовало прочесть до конца wink. Во-первых, надо обязательно сортировать по cats_id, во-вторых, попробуйте не джоинить, а как-то так:

select t.* from ( SELECT cats.id as cats_id, cats.cat_title, news.id as news_id, news.cat_id, news.title  FROM cats JOIN news ON cats.id=news.cat_id order by cats.id ) t WHERE IF(@p=cats_id, @i:=@i+1,(@i:=0) OR (@p:=cats_id)) AND @i<@n;


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 19.10.2011 00:36:59

Andrey66
Участник
Зарегистрирован: 01.04.2011
Сообщений: 7

Re: Group by и limit

Спасибо, работает!

Неактивен

 

#6 19.10.2011 00:39:33

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Group by и limit

2Andrey66 - это хорошо ).

Вася, а как у тебя с джоином (без внешней выборки) работать ухитрялось?.. У меня на первом же простейшем примере поломалось.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 19.10.2011 23:33:58

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Group by и limit

Никак.
Я или писал без проверки, или попал на частный случай (например, за счет выборки по ключу результат джойна является упорядоченным по нужному полю).

А так, да. Сортировку нужно явно указывать.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson