2013-03-13 170 views
14

我有以下表中調用的問題:如何按降序排序

ID | asker 
1 | Bob 
2 | Bob 
3 | Marley 

我只需要選擇一次,每個提問者如果有與多個同名的提問者,選擇最高ID的一個。因此,預期的結果:

ID | asker 
3 | Marley 
2 | Bob 

我用下面的查詢:

SELECT * FROM questions GROUP by questions.asker ORDER by questions.id DESC 

我得到以下結果:

ID | asker 
3 | Marley 
1 | Bob 

因此,選擇第一個 '鮑勃' 遇到代替最後一個。

感謝

+0

問:您的ID列設置爲INTERGERS或VARCHAR? – 2013-03-13 16:01:13

+0

自動增量整數 – 2013-03-13 16:02:07

回答

25

如果你想爲每個asker最後id,那麼你應該使用聚合函數:

SELECT max(id) as id, 
    asker 
FROM questions 
GROUP by asker 
ORDER by id DESC 

你得到異常結果的原因是因爲MySQL使用GROUP BY的擴展名,它允許選擇列表中的項目不被聚合並且不包含在GROUP BY子句中。但是,這可能會導致意外的結果,因爲MySQL可以選擇返回的值。 (見MySQL Extensions to GROUP BY

從MySQL的文檔:

MySQL的擴展使用GROUP BY的,這樣的選擇列表可參考在GROUP BY子句中未命名的非聚合列。 ...您可以使用此功能通過避免不必要的列排序和分組來獲得更好的性能。但是,這非常有用,因爲每個未在GROUP BY中命名的非聚合列中的所有值對於每個組都是相同的。服務器可以自由選擇每個組中的任何值,因此除非它們相同,否則所選值是不確定的。此外,每個組的值的選擇不能通過添加ORDER BY子句來影響。結果集的排序在選擇值後發生,而ORDER BY不影響服務器選擇的值。

+0

沒有和我一起工作 – itsazzad 2016-04-19 10:38:21

+0

@itsazzad你是什麼意思「不爲我工作」?這不是對問題最具描述性的解釋。 – Taryn 2016-04-19 11:39:27

+2

如果我使用'SELECT *,max(id)作爲id',那麼它沒有給出正確的結果 – itsazzad 2016-04-19 11:44:48

2

的記錄需要使用GROUP BYMAX()讓每一個asker最大ID進行分組。

SELECT asker, MAX(ID) ID 
FROM TableName 
GROUP BY asker 

輸出

╔════════╦════╗ 
║ ASKER ║ ID ║ 
╠════════╬════╣ 
║ Bob ║ 2 ║ 
║ Marley ║ 3 ║ 
╚════════╩════╝ 
+0

儘管如何獲得每個ID的最大ID? – fungusanthrax 2017-07-17 14:24:15

1

其他人正確使用MAX(ID)來獲得你想要的結果。如果您想知道爲什麼您的查詢不起作用,那是因爲ORDER BY發生在之後GROUP BY

15

通常MySQL只允許按升序排列記錄。所以我們可以在分組之前訂購記錄。

 
SELECT * 
FROM (
    SELECT * 
    FROM questions 
    ORDER BY id DESC 
) AS questions 
GROUP BY questions.asker 
0

讓每一個列:

SELECT * FROM questions 
WHERE id IN 
(SELECT max(id) as id, asker 
FROM questions 
GROUP by asker 
ORDER by id DESC) 

@bluefeet的答案的改進版本。