2011-05-06 87 views
1

當我有這樣的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 

現在,我想使用MAX日化集團的。所以查詢變成:

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(該分組的最大日期)。但我也從這種行爲方面得到相應的線用戶(在示例pierre)。

但它需要另一個。

爲什麼?它不選擇整行?我該如何解決這個問題?乾杯

編輯

其實,我應該申請這個分組到這整個查詢:

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 
+0

使用MAX(日期)只是從分組記錄中選擇最大日期。您將需要一個子查詢或另一個連接來獲取每個組的最大日期的記錄。所以有很多類似的問題,我會舉一個例子。 – Galz 2011-05-06 23:05:53

回答

3

試試這個(讓我知道如果它的工作原理):

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

試過了。但它不返回最近的日期;它也會返回最古老的... – kwichz 2011-05-06 23:22:00

+0

@kwichz編輯第一個,添加另一個。現在試試。 – Galz 2011-05-06 23:27:16

+0

雙方打印'歡迎daniel 2010-07-09 22:14:49',不''歡迎pierre 2011-11-05 23:12:22' – kwichz 2011-05-06 23:27:44

0

您需要包括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 
+1

我不確定這是否會返回OP要求的內容,這是(我相信)每個類別ID的最新消息。這將返回每個類別ID的許多記錄。 – Galz 2011-05-06 23:13:48

+0

是的,其實它返回了很多記錄... – kwichz 2011-05-06 23:18:32