SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 02.04.2011 19:28:22

Alexey
Участник
Зарегистрирован: 14.01.2011
Сообщений: 5

Выборка Group BY Limit

Здравствуйте.
Подскажите, пожалуйста, как сделать выборку из БД по 10 записей каждого типа ключа category, т.е. выбрать по 10 записей, имеющих одинаковое значение category отсортированных в порядке убывания атрибута date.
И второй вопрос, что из себя будет представлять результат?



Комментарий модератора.
См Выборка последних записей в группах
В этой статье приведено 6 вариантов решения в один запрос.

Неактивен

 

#2 02.04.2011 20:02:33

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Выборка Group BY Limit

SELECT * FROM tablename WHERE category = 1 ORDER by `date` DESC LIMIT 10
UNION
SELECT * FROM tablename WHERE category = 2 ORDER by `date` DESC LIMIT 10
...

Будут строки по 10 штук с сортировкой по дате внутри группы. Хорошего способа
сделать так, чтобы список групп подбирался автоматически, нет.

Неактивен

 

#3 02.04.2011 21:28:51

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

Re: Выборка Group BY Limit

Можно с помощью пользовательских переменных:

http://sqlinfo.ru/forum/viewtopic.php?id=1742
http://sqlinfo.ru/forum/viewtopic.php?id=3492

Неактивен

 

#4 02.04.2011 22:06:15

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Выборка Group BY Limit

Но всегда полным сканом?

Неактивен

 

#5 03.04.2011 01:15:33

Alexey
Участник
Зарегистрирован: 14.01.2011
Сообщений: 5

Re: Выборка Group BY Limit

Ещё вопрос. Стоит ли делать 1 запрос с унионами или лучше сделать 10 запросов.
Имею ввиду, что касательно нагрузки.

Неактивен

 

#6 03.04.2011 07:30:42

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Выборка Group BY Limit

Не принципиально, заметной разницы по производительности не будет.

Неактивен

 

#7 03.04.2011 12:34:19

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

Re: Выборка Group BY Limit

paulus написал:

Но всегда полным сканом?

К сожалению, да.

Неактивен

 

#8 07.04.2011 13:54:48

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

Re: Выборка Group BY Limit

paulus написал:

SELECT * FROM tablename WHERE category = 1 ORDER by `date` DESC LIMIT 10
UNION
SELECT * FROM tablename WHERE category = 2 ORDER by `date` DESC LIMIT 10

Будут строки по 10 штук с сортировкой по дате внутри группы. Хорошего способа
сделать так, чтобы список групп подбирался автоматически, нет.

Paulus, сори за буквоедство, ты пишешь, что хорошего способа нет, а плохой способ есть? Возможно ли в рамках реляционной базы данных, без пользовательских переменных mysql и хранимых процедур составить такой запрос?


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

Неактивен

 

#9 07.04.2011 14:10:36

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Выборка Group BY Limit

deadka, без переменных будет все с подзапросами. Не запрещается для каждого подзапросом посчитать сколько записей с той же категорией, но с большей датой, а затем наложить условие c<10. Типа такого:

SELECT cat, (SELECT count(*) FROM tbl t2 WHERE t2.c=t1.c AND t2.date>t1.date ) c  FROM tbl t1 HAVING c<10 ORDER BY cat ASC, date DESC;

Неактивен

 

#10 07.04.2011 18:33:04

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

Re: Выборка Group BY Limit

rgbeast, спасибо за ответ. Только такой вариант запроса, к сожалению, не работает, не может в where использовать вычисленное в подзапросе значение.


CREATE TABLE `category` ( `cat` int,  `date` date,  `data` bigint(20) unsigned default NULL) ENGINE=MyISAM DEFAULT CHARSET=utf8;

insert into category values
 (1,'2001-01-01',11)
,(2,'2002-02-01',21)
,(3,'2003-03-01',31)
,(4,'2004-04-01',41)
,(3,'2003-03-02',32)
,(1,'2001-01-02',12)
,(4,'2004-04-02',42)
,(2,'2002-02-02',22)
,(4,'2004-04-03',43)
,(3,'2003-03-03',33)
,(2,'2002-02-03',23)
,(1,'2001-01-03',13)
,(2,'2002-02-04',24)
,(4,'2004-04-04',44)
,(1,'2001-01-04',14)
,(3,'2003-03-04',34);

SELECT
    cat,
    (SELECT count(*) FROM category t2 WHERE t2.cat=t1.cat AND t2.date>t1.date ) c  
FROM
    category t1
WHERE
    c<10
ORDER BY
    cat ASC, date DESC;
 


mysql> SELECT  cat,  (SELECT count(*) FROM category t2 WHERE t2.cat=t1.cat AND t2.date>t1.date ) c   FROM  category t1  WHERE  c<10  ORDER BY  cat ASC, date DESC;
ERROR 1054 (42S22): Unknown column 'c' in 'where clause'

Отредактированно deadka (07.04.2011 18:33:57)


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

Неактивен

 

#11 07.04.2011 18:38:54

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Выборка Group BY Limit

Прошу прощения, исправил на HAVING

Неактивен

 

#12 07.04.2011 23:50:56

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

Re: Выборка Group BY Limit

Да, спасибо, теперь работает smile. Значит на этапе, когда фильтруется "where" подзапросы еще не выполнились, поэтому having..


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

Неактивен

 

#13 08.04.2011 01:48:39

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Выборка Group BY Limit

WHERE по синтаксису работает только с полями исходной таблицы, но не с рассчитанными полями и не с результатами групповых операций. Это допускает оптимизации плана исполнения (например выборка по индексу и др.).

Неактивен

 

Board footer

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