Группировка

JIEXA

Новичок
Группировка

Есть таблицы
comments
comment_id
comment_news_id
comment_datepost

news
news_id
news_subject
news_community
news_public

community
community_id
community_alias

Нужно показать последние 15 комментариев, только чтобы если к примеру к 1 новости больше 2 комментариев, то они не дублировались. Я попробывал так:

PHP:
    SELECT comments.comment_id,comments.comment_datepost, news.news_subject, community.community_alias  
    FROM comments 
    LEFT JOIN news ON news.news_id=comments.comment_news_id 
    LEFT JOIN community ON community.community_id=news.news_community 
    WHERE news.news_public='Y' 
    GROUP BY news.news_id 
    ORDER BY comments.comment_datepost DESC  
    LIMIT 15

Выводяться только уникальные записи, но они почему-то упорядочеваються не так как надо. Точнее они упорядочиваються по дате первого комментария к новости, а не по дате последнего. Почему так - не понимаю, вроде всё правильно написал. Подскажите пожалуйста.
 

zerkms

TDD infected
Команда форума
1. сортировка происходит после группировки, когда выборка уже готова
2. покажи выборку

-~{}~ 02.09.07 11:27:

ps: вопрос, который ты задашь после моего поста - задавался миллион раз, и продолжает задаваться с завидным постоянством. не утруждайся - а можешь сразу попробовать поискать ;)
 

JIEXA

Новичок
1. А как же выйти из ситуации?
2.
PHP:
comment_id 	comment_datepost 	news_subject 	community_alias 
29	2007-09-02 03:30:20	Google	mysql
28	2007-09-02 03:02:20	uhuuui	NULL
9	2007-08-26 02:25:35	Как обычно паркуемся не читая что написано... (4 ф...	funphotos
6	2007-08-21 14:47:43	Ноутбук за $50 (5 фото)	NULL
1	2007-08-19 03:05:08	Бритни в бассейне (4 фото)	funphotos
-~{}~ 02.09.07 17:27:

по поиску полазил - ответа не нашел :(

-~{}~ 03.09.07 00:49:

PHP:
SELECT news.news_subject, comm1.comment_news_id, community.community_alias, (

SELECT comm2.comment_id
FROM comments AS comm2
WHERE comm2.comment_news_id = comm1.comment_news_id
ORDER BY comm2.comment_datepost DESC 
LIMIT 1 
) AS comment_id, (

SELECT comm2.comment_datepost
FROM comments AS comm2
WHERE comm2.comment_news_id = comm1.comment_news_id
ORDER BY comm2.comment_datepost DESC 
LIMIT 1 
) AS date_post
FROM comments AS comm1
LEFT JOIN news ON news.news_id = comm1.comment_news_id
LEFT JOIN community ON community.community_id = news.news_community
WHERE news.news_public = 'Y'
GROUP BY news.news_id
ORDER BY comm1.comment_datepost DESC 
LIMIT 15
Вот вариант, который предложил мне знакомый. Работает. Но довольно здоровый запрос получился, вот решил спросить, может у кого есть идеи выйти из ситуации более шустрым запросом?
 

zerkms

TDD infected
Команда форума
запрос делается с одним подзапросом
в подзапросе ищешь MAX(id) для комментов
в запросе - джоином прибиваешь именно нужные последние комменты (с максимальным ид)
 

JIEXA

Новичок
а сортировку как тогда делать? непонятно... не могли бы вы примерчик дать
 

zerkms

TDD infected
Команда форума
JIEXA
сортировку чего?
попробуй написать запрос по тому алгоритму что дал я, и показать что у тебя получилось
 

JIEXA

Новичок
блин мучался, мучался, непонятно, помогите плз примерчиком на моей структуре
 

alpine

Новичок
JIEXA
Если в лоб
Код:
SELECT comments.comment_id,comments.comment_datepost, news.news_subject, community.community_alias  
    FROM comments 
    LEFT JOIN news ON news.news_id=comments.comment_news_id 
    LEFT JOIN community ON community.community_id=news.news_community 
    WHERE 
          news.news_public='Y' 
        AND 
          comments.comment_id IN(SELECT MAX(c.comment_id) FROM comments as c GROUP BY c.comment_news_id)
    ORDER BY comments.comment_datepost DESC
    LIMIT 15
 
Сверху