MySQL GROUP BY - 返回错误的日期

时间:2012-02-20 01:19:35

标签: mysql sql group-by

table: chat_thread

+-----------+----------+--------------------+
|        id | title    |             date   |
+-----------+----------+--------------------+
|         1 | Thread 1 | 2012-02-16 01:12:40| 
|         2 | Thread 2 | 2012-02-17 02:32:44| 
+-----------+----------+--------------------+

table: chat_comment

+-----------+----------+--------------------+
|        id | t_id     |             date   |
+-----------+----------+--------------------+
|         1 | 1        | 2012-02-19 19:45:32| 
|         2 | 1        | 2012-02-15 22:29:20| 
+-----------+----------+--------------------+

这是我的情况,我创建了一个包含线程和评论的基本论坛。我想在最后一个评论日期前订购,如果没有评论,那么线程开始日期。我遇到的问题是试图在我的while循环中回显最后一个回复日期。

mysql_query("
SELECT *,
chat_comment.date AS commentDate,
chat_thread.date AS threadDate
FROM chat_thread
LEFT JOIN chat_comment ON chat_thread.id = chat_comment.t_id
GROUP BY chat_thread.id
ORDER BY commentDate DESC, threadDate DESC");

我的问题不是线程的正确顺序,而是注释日期。在上面的表格中,如果我试图回应日期,我现在正在2012-02-15 22:29:20而不是最近的2012-02-19 19:45:32。

我有什么问题吗?

我认为它与GROUP BY有关,因为如果我将其更改为GROUP BY chat_comment.date,那么while循环中的日期是准确的,但是有重复项,因为我没有通过chat_thread进行分组。 ID

2 个答案:

答案 0 :(得分:4)

您选择任意,而不是选择 last chat_comment.date。 (有关详细说明,请参阅MySQL Reference Manual, §11.6.3: GROUP BY and HAVING with Hidden Columns。)您需要使用MAX(chat_comment.date)而非chat_comment.date

答案 1 :(得分:1)

如果你想要一个最大值,你必须使用MAX(),然后你必须按所有其他列进行GROUP,如下所示:

mysql_query("
SELECT chat_thread.id, chat_thread.title, chat_thread.date,
MAX(chat_comment.date) AS commentDate
FROM chat_thread
LEFT JOIN chat_comment ON chat_thread.id = chat_comment.t_id
GROUP BY chat_thread.id, chat_thread.title, chat_thread.date
ORDER BY MAX(chat_comment.date) DESC, chat_thread.date DESC");