2017-08-28 120 views
-2

與此問題類似:MySQL 5.7 group by latest recordMySQL 5.7如何使用GROUP BY進行排序?

我不確定如何在5.7中正確執行此操作。也有第2類的可能性。 5.6工作查詢,我試圖在5.7複製:

SELECT id FROM test 
GROUP BY category 
ORDER BY sort1 DESC, sort2 DESC 

ID並不總是最高的,所以MAX(ID)不起作用。

展望上面的鏈接,對於單排序的解決方案應該是:

SELECT t1.* 
FROM test t1 
    INNER JOIN (
     SELECT category, max(sort) AS sort FROM test GROUP BY category 
    ) t2 ON t2.category = t1.category AND t2.sort = t1.sort 

但如何將它與2排序工作嗎?

+0

不明白你爲什麼使用沒有聚合函數的組。你想達到什麼目的? – Lamar

+1

如果你不使用聚合,爲什麼使用'GROUP BY'?如果您需要聚合一列,則只能使用「GROUP BY」。這甚至不會在任何其他dbms上運行。 – Eric

+0

@lamar&eric,你們是對的。我已更新查詢。我想不出一個很好的解決方案,除了創建一個計算排序,比如SELECT(sort * 1000 + sort2)作爲sort_score –

回答

0

當您通過不屬於您正在分組的列的查詢(即您的id)在組中選擇某一列時,除非使用其他聚合函數,否則無法控制此值。如果你想排序,使用MIN或MAX:

SELECT MAX(id), category, FROM `test2` 
GROUP BY category; -- always returns 200 

SELECT MIN(id), category, FROM `test2` 
GROUP BY category; -- always returns 100 
+0

我無法使用MIN/MAX,因爲排序最高的結果ID可能在中間。 –

0

爲什麼你沒有ORDER BY在你的外部查詢,而不是?

SELECT * 
    FROM (
     SELECT 100 AS id, 1 AS category, NULL AS sort 
     UNION 
     SELECT 200 AS id, 1 AS category, 2 AS sort 
     ) dt 
GROUP BY category 
ORDER BY sort DESC; 

看來,它被分組後的數據發生了什麼,它將第一個數據忽略了ORDER BY DESC。在你的第一個查詢中,它首先下降,然後通過獲取第一個200的記錄進行組合。而且,這不應該是你應該使用GROUP BY的方式。它與聚合函數一起使用。

+0

這似乎不起作用?在MySQL 5.6把這種排序放在子查詢中,但不在MySQL 5.7 –

+0

當我在MySQL 5.7中運行這個時,結果是100. –

1

您正在以錯誤的方式使用GROUP BY。 將group by視爲將數據行分隔成不同組的方式。每個組都有多個行,基於逐列的值。

獲得這些組後,選擇表格列(如:select *)就像隨機選取該組中的任何一行。這沒有幫助也沒有用。

通常一旦我們對記錄(或行)進行分組,我們需要找到關於這些記錄的元信息。例如:獲取該組中記錄的計數(如:select count(*))或該組中特定列的值的總和(如:select sum(price)),或獲取最小值,最大值或平均值。

所以簡而言之,當你使用group時你應該使用它的聚合函數,否則它不會對你有任何好處。

+0

你是對的。我已經更新了這個問題。我有它單一排序工作,但無法讓它與2種工作。 –

+0

你可以更清楚你的意思2種?你可以在上面的問題中添加更多細節嗎? – Lamar

+0

基本上由2個字段排序:sort,sort2。 –