我正在解決 mySQL 問題,我想根據玩家的身高范圍對結果進行分組。
然而,當我寫下
SELECT
id, --displays error, needs to be included in GROUP BY
player_name,
CASE
WHEN height <= 50 THEN '0-50'
WHEN height BETWEEN 50 AND 70 THEN '51-70'
WHEN height BETWEEN 71 AND 80 THEN '71-80'
ELSE '80 '
END
AS height_range
FROM
benn.college_football_players
GROUP BY
height_range
ORDER BY
height_range DESC
我收到一個錯誤,id 應該在 group by 子句中使用。
為什么這是必要的?為什么我不能按派生列“height_range”分組?
uj5u.com熱心網友回復:
為什么這是必要的?為什么我不能按派生列“height_range”分組?
你有很多相同的行height_range。
您對這些行進行分組。查詢必須為它們回傳一行。
每個源行都有自己的id,這些值不同。但是一個輸出行可能只包含一個值。他們呢?服務器不知道......它會產生錯誤。
id從輸出串列中洗掉或在聚合函式中使用它(例如,SELECT MAX(id) AS id, ...)。這會指示服務器從所有現有的正確值中回傳一個確定的值。
附注。在此修復后,您將看到player_name輸出列出現相同的問題。
聚苯乙烯。想想你是否需要在 GROUP BY 中...
uj5u.com熱心網友回復:
洗掉該GROUP BY條款。
SELECT
id,
player_name,
CASE
WHEN height <= 50 THEN '0-50'
WHEN height <= 70 THEN '51-70'
WHEN height <= 80 THEN '71-80'
ELSE '80 '
END AS height_range
FROM benn.college_football_players
ORDER BY height_range DESC
您不是在聚合,即當來自多行的值聚合為一個值時,例如SUM().
您將單個值呈現height為單個height_range值(對于每一行),這可以被描述為“將高度表示為一組范圍中的一個”,但不是 SQL 意義上的“分組”。
注意案例的簡化——使用第一個條件為真的案例,所以不需要使用BETWEEN.
uj5u.com熱心網友回復:
執行查詢SELECT @@sql_mode以驗證ONLY_FULL_GROUP_BY是否在查詢結果中。
來自 MySQL 檔案 ONLY_FULL_GROUP_BY
拒絕選擇串列、HAVING 條件或 ORDER BY 串列參考非聚合列的查詢,這些列既不在 GROUP BY 子句中命名,也不在功能上依賴于(唯一確定的)GROUP BY 列。
它需要或者去除上面的服務器設定,允許在一個比較推薦的方式查詢執行或加聚合函式列不在你的GROUP BY,例如SELECT MAX(id),GROUP_CONCAT(id)等等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/327564.html
上一篇:與雪花中的條件相加
下一篇:Androi作業室的布局錯誤
