ORDER BY首先提到,然后是另一个专栏

时间:2014-03-07 05:25:23

标签: mysql

我们假设我有一个名为' messages':

的表格
+-----------+--------+
| timestamp | poster |
+-----------+--------+
|         1 | John   |
|         2 | Peter  |
|         3 | Peter  |
|         4 | Chris  |
|         5 | John   |
+-----------+--------+

我希望查询首先按第一张海报列出所有帖子,然后按第二张海报列出所有帖子等。不使用子查询。第一张海报由时间戳确定。找出谁是第一个并返回所有帖子,然后谁是第二个:

+-----------+--------+
| timestamp | poster |
+-----------+--------+
|         1 | John   |
|         5 | John   |
|         2 | Peter  |
|         3 | Peter  |
|         4 | Chris  |
+-----------+--------+

修改
好的,我的问题太简单了。你提供工作的基本例子是因为(J)ohn来自(P)eter。如果彼得是第一个怎么办?您需要将DESC添加到poster子句中。使用简单ORDER BY的SQL语句不能解决第一,第二,第三等人的排序问题。

再次编辑
我添加了#34; Chris"混合使我更清楚我想要什么。约翰是第一张海报;得到他所有的帖子。彼得,因为他是第二。然后克里斯。

6 个答案:

答案 0 :(得分:1)

无法想到没有子查询的方法,

但是如果你能接受你的答案作为csv列表的时间戳。那么这是一种方式。

SELECT poster,
       GROUP_CONCAT(timestamp ORDER BY timestamp) as timestamps       
FROM messages
GROUP BY poster
ORDER BY MIN(timestamp)

sqlFiddle

答案 1 :(得分:1)

我认为除了创建另一个结果集并加入之外别无他法:

SELECT poster, MIN(timestamp) AS first_ts
FROM messages
GROUP BY poster
ORDER BY first_ts;

结果:

+--------+-----------+
| poster | first_ts  |
+--------+-----------+
| John   | 1         |
| Peter  | 2         |
| Chris  | 4         |
+--------+-----------+

答案 2 :(得分:0)

使用ORDER BY

SELECT * FROM my_table ORDER BY poster ASC;

答案 3 :(得分:0)

根据@Deepak写的内容,您需要ORDER BY

中的两个字段
SELECT timestamp, poster 
FROM my_table 
ORDER BY poster, timestamp;

这将为您提供第二张表。

答案 4 :(得分:0)

试试这个......

 SELECT * 
 FROM TableName 
 ORDER BY poster ASC, 
          timestamp ASC;

或者只是......

 SELECT * 
 FROM TableName 
 ORDER BY poster, 
          timestamp;

如果未指定排序顺序,则SQL会自动采用ASC或升序,否则,请添加DESC以进行降序。

答案 5 :(得分:0)

试试这个:

SELECT * FROM messages ORDER BY timestamp ASC, poster ASC;

请阅读更多here