Проблема при группировке - PullRequest
1 голос
/ 07 мая 2011

У меня есть запрос MySql:

SELECT forum_categories.title, forum_messages.author, forum_messages.date AS last_message
FROM forum_categories
JOIN forum_topics ON forum_topics.category_id=forum_categories.id 
JOIN forum_messages ON forum_messages.topic_id=forum_topics.id
WHERE forum_categories.id=6
ORDER BY forum_categories.date ASC

И вывод следующий:

Welcome     daniel      2010-07-09 22:14:49
Welcome     daniel      2010-06-29 22:14:49
Welcome     luke        2010-08-10 20:12:20
Welcome     skywalker   2010-08-19 22:12:20
Welcome     delicious   2010-10-09 19:12:20
Welcome     daniel      2011-11-05 23:12:20
Welcome     pierre      2011-11-05 23:12:22

Теперь я бы хотел сгруппировать его, используя МАКСИМАЛЬНУЮ дату. Таким образом, запрос становится:

SELECT forum_categories.title, forum_messages.author, forum_messages.date AS last_message, MAX(forum_messages.date)
FROM forum_categories
JOIN forum_topics ON forum_topics.category_id=forum_categories.id 
JOIN forum_messages ON forum_messages.topic_id=forum_topics.id
WHERE forum_categories.id=6
GROUP BY forum_categories.id
ORDER BY forum_categories.date ASC

ИДЕАЛЬНОЕ! Дата взятия верна: 2011-11-05 23: 12: 22 * ​​1011 * (МАКСИМАЛЬНАЯ дата для этой группировки). Но я также аспект из этого поведения, чтобы получить corrispondent user для этой строки (в примере pierre ).

Но потребуется еще один.

Почему? Он не выделяет всю строку? И как я могу исправить эту проблему? Приветствия

EDIT

На самом деле, я должен применить эту группировку ко всему этому запросу:

SELECT forum_categories.title, COUNT(DISTINCT forum_topics.id) AS total_topics, SUM(CASE WHEN forum_messages.original=0 THEN 1 ELSE 0 END) AS total_replies, forum_messages.author, MAX(forum_messages.date) AS last_message
FROM forum_categories
JOIN forum_topics ON forum_topics.category_id=forum_categories.id 
JOIN forum_messages ON forum_messages.topic_id=forum_topics.id
GROUP BY forum_categories.id 
ORDER BY forum_categories.date

Ответы [ 2 ]

3 голосов
/ 07 мая 2011

Попробуйте это (дайте мне знать, если это работает):

SELECT forum_categories.title, forum_messages.author, 
   forum_messages.date AS last_message
FROM forum_categories
JOIN forum_topics ON forum_topics.category_id=forum_categories.id
JOIN forum_messages ON forum_messages.topic_id=forum_topics.id
JOIN (SELECT MAX(m.date) as date, top.category_id  
     FROM forum_messages m
     JOIN forum_topics top ON m.topic_id = top.id
     GROUP BY top.category_id) as t
  ON t.category_id = forum_topics.category_id AND t.date = forum_messages.date
WHERE forum_categories.id=6
GROUP BY forum_categories.id

Вот второй вариант:

SELECT forum_categories.title, forum_messages.author, 
       forum_messages.date AS last_message
FROM forum_categories
JOIN forum_topics ON forum_topics.category_id=forum_categories.id
JOIN forum_messages ON forum_messages.topic_id=forum_topics.id
WHERE forum_categories.id=6
AND forum_messages.date = (SELECT MAX(date)
                           FROM forum_messages t
                           WHERE t.topic_id = forum_topics.id)
GROUP BY forum_categories.id
ORDER BY forum_categories.date ASC
0 голосов
/ 07 мая 2011

Вам необходимо включить forum_categories.title и forum_messages.author в ваше предложение GROUP BY, поскольку они не являются агрегатными функциями.Представьте себе, что GROUP BY говорит о том, какие значения в результирующем наборе следует «смять» вместе в одну строку.

Также вам, скорее всего, потребуется упорядочить по столбцу в наборе результатов, например, last_message (вместоforum_messages.date)

Итак:

SELECT forum_categories.title, forum_messages.author, forum_messages.date AS last_message,            MAX(forum_messages.date)
FROM forum_categories
JOIN forum_topics ON forum_topics.category_id=forum_categories.id 
JOIN forum_messages ON forum_messages.topic_id=forum_topics.id
WHERE forum_categories.id=6
GROUP BY forum_categories.title, forum_messages.author
ORDER BY last_message ASC
...