2011-02-28 91 views
0

我需要在兩列之後排序MySQL表,但不像常規排序。在聊天應用程序,我希望得到的結果通過時間戳字段排序,但也由他們發送SELECT ... ORDER BY field IN(SELECT ...)not working on duplicate field

CREATE TABLE messages (
    id int(10) unsigned NOT NULL AUTO_INCREMENT, 
    timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    sender int(10) unsigned NOT NULL, 
    message char(255) NOT NULL, 
    PRIMARY KEY (id) 
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; 

INSERT INTO messages VALUES ('1', '2011-02-28 01:58:24', '3', '1'); 
INSERT INTO messages VALUES ('2', '2011-02-28 01:58:28', '3', '2'); 
INSERT INTO messages VALUES ('3', '2011-02-28 01:58:35', '1', '5'); 
INSERT INTO messages VALUES ('4', '2011-02-28 01:58:36', '2', '7'); 
INSERT INTO messages VALUES ('5', '2011-02-28 01:58:38', '3', '3'); 
INSERT INTO messages VALUES ('6', '2011-02-28 01:58:39', '2', '8'); 
INSERT INTO messages VALUES ('7', '2011-02-28 01:58:40', '1', '6'); 
INSERT INTO messages VALUES ('8', '2011-02-28 01:58:41', '3', '4'); 

所以分組:

ORDER BY時間戳,發件人沒用

ORDER BY發件人,時間戳非常好,但它不會首先顯示較早的消息

SELECT timestamp, sender, message FROM messages ORDER BY sender IN (SELECT DISTINCT sender FROM messages ORDER BY timestamp), timestamp; 

不起作用,因爲我認爲它必須工作。這裏是我從該查詢預期(OFC是不是我想從這個查詢得到:P):

+---------------------+--------+---------+ 
| timestamp   | sender | message | 
+---------------------+--------+---------+ 
| 2011-02-28 01:58:24 |  3 | 1  | 
| 2011-02-28 01:58:28 |  3 | 2  | 
| 2011-02-28 01:58:38 |  3 | 3  | 
| 2011-02-28 01:58:41 |  3 | 4  | 
| 2011-02-28 01:58:35 |  1 | 5  | 
| 2011-02-28 01:58:40 |  1 | 6  | 
| 2011-02-28 01:58:36 |  2 | 7  | 
| 2011-02-28 01:58:39 |  2 | 8  | 
+---------------------+--------+---------+ 

任何想法?鏈接?提示?什麼? 在此先感謝,有任何疑問,歡迎

+0

你能說出什麼查詢應該實現。你說過你想做一個不規則的排序,給出兩個不能做你想做的事情的例子,但是你沒有描述你真正想要的,並且試圖從所提供的表格推斷它是困難的。 – Hamish 2011-02-28 00:22:15

+0

最後一個表是我想得到的,完美查詢的結果:D – SYNCRo 2011-02-28 00:25:13

+0

只需獲取所有郵件,按發件人分組,並按時間戳排序,但未按發件人和時間戳排序 – SYNCRo 2011-02-28 00:26:33

回答

1

它會爲你工作ORDER BY sender asc, timestamp desc

UPDATE
你可能需要的東西是這樣的:

SELECT a.timestamp, a.sender, a.message 
FROM messages a 
INNER JOIN 
(SELECT b.sender_id, MIN(b.timestamp) as timestamp 
    FROM messages b GROUP BY sender 
)c ON (c.sender = a.sender) 
ORDER BY c.timestamp, a.sender 
+0

複製,因爲由發件人ASC排序不會給我第一個消息時間戳,將給我第一個發件人 – SYNCRo 2011-02-28 00:32:39

+0

我認爲更新後的版本是你想要的(按最小時間戳排序,然後由發件人排列) – a1ex07 2011-02-28 00:48:14

+0

1054 - '字段列表'中未知的列'b.sender_id' – SYNCRo 2011-02-28 00:48:18

0
SELECT * FROM messages ORDER BY sender, timestamp ASC; 

將發件人進行排序,然後通過時間戳給你們每人發件人數據,通過時間戳排序。在MySQL中,當你使用多種排序時,它只是按一種排序,然後是另一種排序。

你所試圖實現的是..嗯,是不可能的,你可以,如果他們不組發送者不是爲了與發送者的想法..什麼我給的是你會在MySQL

得到最接近
+0

好吧,那麼'SELECT * FROM countries ORDER by iso_code IN('UK','US')desc,iso_code',有兩種基於單個字段的東西......像某些最喜歡的結果。 (查詢從[MySQL SELECT語法頁面](http://dev.mysql.com/doc/refman/5.0/en/select.html) – SYNCRo 2011-02-28 00:29:41