Mysql

MySQL:條件選擇中的引用聚合函式

  • July 19, 2018

我想像這樣引用聚合函式:

樣本數據:

+-----------+----------+-------+
| member_id | group_id | score |
+-----------+----------+-------+
|         1 |        1 |    12 |
|         2 |        1 |     2 |
|         3 |        1 |    20 |
|         4 |        2 |    40 |
|         5 |        2 |     4 |
|         6 |        3 |    19 |
|         7 |        3 |    17 |
+-----------+----------+-------+

詢問:

SELECT MAX(IF(score = MAX(score), member_id, NULL)) AS member
FROM members
GROUP BY group_id

預期結果:

+-----------+
| member_id |
+-----------+
|         3 |
|         4 |
|         6 |
+-----------+

小提琴: http ://sqlfiddle.com/#!9/08af68/2

但這會導致錯誤:

組功能使用無效

我在這裡簡化了一些事情,但我試圖在更複雜的場景中使用它,其中score值是大型複雜查詢的結果。以我所知道的標準方式執行此操作會導致看起來有些荒謬,因為獲取工作值的初始查詢超過 35 行程式碼。

**問題:**為什麼不允許這樣使用聚合函式?是否有一種解決方法不涉及有效地複制整個內容SELECT以獲取MAX()用作參考點的價值?

切肉刀。但是不行。

要實現您的要求,需要對數據進行兩次傳遞。事情不是這樣的。

第一遍是找到每個組的最大值;第二遍是對照最大值檢查所有值。

您可以使用子查詢、一種@variable或多種其他方式來完成。按照標籤查看“分組最大值”的方法。

似乎 max 不能對同一屬性使用兩次。

因此,您期望選擇行的 member_id。

如下

+-----------+----------+-------+
| member_id | group_id | score |
+-----------+----------+-------+
|         3 |        1 |    20 |
|         4 |        2 |    40 |
|         6 |        3 |    19 |
+-----------+----------+-------+

但結果不一樣。

+-----------+----------+-------+
| member_id | group_id | score |
+-----------+----------+-------+
|         1 |        1 |    20 |
|         4 |        2 |    40 |
|         6 |        3 |    19 |
+-----------+----------+-------+

因為 group_id 1 的得分最大值為 20。但是 member_id 被選擇為第一行值。

改成這樣

SELECT 
 ( SELECT member_id 
   FROM members m 
   WHERE m.score = MAX(members.score) 
 ) AS member
FROM members
GROUP BY group_id

引用自:https://dba.stackexchange.com/questions/212590