2011-02-28 70 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