2012-02-20 8 views
1
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 GROUP BY - неверные даты

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 то дата в то время цикла является точной, но есть дубликаты, потому что я не группируя по chat_thread.id

ответ

4

Вместо того, чтобы выбрать последниеchat_comment.date, вы выбираете произвольно. (См. MySQL Reference Manual, §11.6.3: GROUP BY and HAVING with Hidden Columns для подробного объяснения этого.) Вам нужно использовать MAX(chat_comment.date) вместо chat_comment.date.

+0

Спасибо, я знал, что это, вероятно, что-то просто я скучал. Я приму этот ответ, как только это позволит. Еще раз спасибо! – Jako

+0

@ Jako: Добро пожаловать! – ruakh

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");