2014-03-07 36 views
2

比方說,我有一個名爲表「消息」:ORDER BY先提,然後由另一列

+-----------+--------+ 
| 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添加到海報條款中。使用簡單的ORDER BY你的SQL語句不應對誰是第一,第二,第三排序的問題,等等。

再次編輯
我補充說:「克里斯」的組合,以使其更平原到我想要的。約翰是第一張海報;獲取他所有的帖子。彼得,因爲他是第二。然後Chris。

+0

哪裏是'timestamp'列? –

+0

你可以在這裏學習一些基礎http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization。html – jomsk1e

+0

@Prix,更改了鏈接XD – jomsk1e

回答

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   | 
+--------+-----------+ 
+0

您能提供一個如何加入您的查詢以提供所需結果集的例子嗎?或者你是指在應用程序中進行循環? – JFriend

0

使用ORDER BY

SELECT * FROM my_table ORDER BY poster ASC; 
0

什麼@Deepak寫的擴展,你需要在ORDER BY

SELECT timestamp, poster 
FROM my_table 
ORDER BY poster, timestamp; 

兩個字段這會給你的第二個表。

0

嘗試......

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

或者乾脆...

SELECT * 
FROM TableName 
ORDER BY poster, 
      timestamp; 

如果不指定排序順序,SQL自動假定ASC或上升,否則,加DESC爲降。

0

試試這個:

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

請閱讀更多here

1

不能想想辦法,而不子查詢做,

,但如果你能接受你的答案爲csv列表的時間戳。那麼這裏是一種方式。

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

sqlFiddle

相關問題