2012-02-20 10 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 chat_comment.dateに変更した場合、私はchat_thread.id

によってグループ化するわけではないので、その後、whileループの日付が正確であるが、重複があるので、それは、GROUP BYとは何かを持っていると思う

答えて

4

最後にchat_comment.dateを選択する代わりに、を任意のに設定します。 (詳細はMySQL Reference Manual, §11.6.3: GROUP BY and HAVING with Hidden Columnsを参照してください)の代わりにMAX(chat_comment.date)を使用する必要があります。

+0

はありがとう、私はそれはおそらく何か簡単なIを知っていました欠けていた。私はそれができるようになるとすぐにこの答えを受け入れます。 もう一度おねがいします! – Jako

+0

@Jako:ようこそ! – ruakh

1

あなたは最大値をしたい場合はMAX()を使用する必要があり、その後、あなたが他のすべての列によってグループに持っているので、同じよう:

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