2010-03-13 45 views
0

我想列出從其他用戶組收到特定用戶的郵件,並按收到的最後一封郵件排序。MySql按問題排序

如果我使用此查詢:

SELECT MAX(id), fromid, toid, message 
    FROM pro_messages 
WHERE toid=00003 
GROUP BY fromid 

我沒有得到來自用戶「fromid」發送到用戶的「風溼」,但第一條消息最後一條消息發送。我能以其他方式做到這一點,還是需要通過兩個查詢或連接表來完成?

ID - 消息ID fromid - 是誰發送的消息 風溼用戶ID - 用戶ID誰收到的消息(在這種情況下,用戶00003)

+0

OP已經張貼了這個問題,並沒有給予足夠的信息。 http://stackoverflow.com/questions/2436342/mysql-query-problem-with-order-by/2436370#2436370 – 2010-03-13 00:22:31

+0

@Sergio請編輯您的原始問題,並提供人們所要求的信息。 – 2010-03-13 00:23:48

+0

好的。我以爲我不能在那裏得到答案,因爲我的問題沒有得到很好的解釋。 – Sergio 2010-03-13 01:00:58

回答

1

首先,你要小心你的toid值那裏。如果將零填充解釋爲八進制數,則零填充可能會造成麻煩:00010爲9位十進制,而toid=9很可能不是您想要的。

至於你的信息麻煩,你得到了MySQL中GROUP運算符的正常行爲。考慮下面的簡化表:

mysql> select * from messages; 
+------+--------+------+---------+ 
| id | fromid | toid | message | 
+------+--------+------+---------+ 
| 1 | 100 | 3 | hi  | 
| 2 | 100 | 3 | there | 
| 3 | 100 | 3 | how  | 
| 4 | 101 | 3 | did  | 
| 5 | 100 | 3 | are you | <--the message you want, right? 
+------+--------+------+---------+ 

當小組fromid,數據庫崩潰的分組條件匹配到一行的所有行。在這種情況下,您的查詢將得到下面的結果

mysql> select max(id), fromid, toid, message from messages where toid=3 group by fromid; 
+---------+--------+------+---------+ 
| max(id) | fromid | toid | message | 
+---------+--------+------+---------+ 
|  5 | 100 | 3 | hi  | 
|  4 | 101 | 3 | did  | 
+---------+--------+------+---------+ 

注意,現在的「100」行都有5最大(ID),但是從ID = 1的消息。這是GROUP BY操作的工作原理。你不能變通解決此用一個簡單的查詢,但如果切換到一個子選擇如下,你會得到正確的結果:

mysql> select id, fromid, toid, message from messages where id in (select max(id) from messages where toid=3 group by fromid); 
+------+--------+------+---------+ 
| id | fromid | toid | message | 
+------+--------+------+---------+ 
| 4 | 101 | 3 | did  | 
| 5 | 100 | 3 | are you | 
+------+--------+------+---------+