SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 27.09.2011 18:01:33

frm
Участник
Зарегистрирован: 27.09.2011
Сообщений: 8

Запрос с group by

Добрый день.
Имеется таблица комментариев со следующими полями:
id int primary key not null,
id_diss int not null,
date datetime

В поле id_diss содержаться идентификаторы тем к которым относятся комментарии, таким образом в этом поле значения не уникальны и могут повторяться. Мне нужно достать 5 последних комментариев из этой таблицы так чтобы все они относились к разным темам, т.е. по одному последнему комментарию из каждой темы. Для этого я использовал следующий запрос:
SELECT
     *
FROM
     Comment
GROUP BY
     id_diss
ORDER BY
    date DESC
LIMIT
    5

Но проблема в том что таким образом я не могу достать пять последних комментариев из разных тем, так как group by отсекает лишние комментарии до того как происходит сортировка по дате и в результате я в самом деле получаю пять комментариев из разных тем, но сами комментарии в этих темах не являются последними по дате.
Вариант с DISTINCT мне не подходит, так как я здесь привел не полный запрос и в нем на самом деле еще присутствуют подзапросы которые достают название темы для каждого комментария из таблицы тем
Помогите разобраться.

Неактивен

 

#2 27.09.2011 18:14:24

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

Re: Запрос с group by

SELECT * FROM Comment c JOIN
(SELECT id_diss, max(`date`) md FROM Comment GROUP BY 1 ORDER BY 2 DESC LIMIT 5) t ON c.id_diss=t.id_diss and c.`date`=t.md;

Неактивен

 

#3 27.09.2011 18:37:15

frm
Участник
Зарегистрирован: 27.09.2011
Сообщений: 8

Re: Запрос с group by

vasya написал:

SELECT * FROM Comment c JOIN
(SELECT id_diss, max(`date`) md FROM Comment GROUP BY 1 ORDER BY 2 DESC LIMIT 5) t ON c.id_diss=t.id_diss and c.`date`=t.md;

После этого ответа пришло понимание что ни черта я не знаю в SQL. Спасибо за ответ, запрос работает, только не совсем понял как он работает. Если не затруднит не могли бы вы дать пояснения к запросу.

Неактивен

 

#4 27.09.2011 18:49:35

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

Re: Запрос с group by

Сначала для каждой темы выбирается последний комментарий - SELECT id_diss, max(`date`) md FROM Comment GROUP BY 1
потом отсекаются 5 последних - ORDER BY 2 DESC LIMIT 5
и полученный результат записывается во временную таблицу t, которая объединяется (join) с таблицей Comment для получения остальных столбцов, соответствующих полученным значениям id_diss и date.

Неактивен

 

Board footer

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