3 回答

TA貢獻1946條經(jīng)驗 獲得超3個贊
您需要有一個完整的小組:
SELECT `name`, `type`, `language`, `code`
FROM `users`
WHERE `verified` = '1'
GROUP BY `name`, `type`, `language`, `code`
ORDER BY `count` DESC LIMIT 0, 25
SQL92要求select子句中的所有列(聚合除外)都是group by子句的一部分。SQL99稍微放松了此限制,并指出select子句中的所有列在功能上必須依賴于group by子句。MySQL默認情況下允許部分分組依據(jù),這可能會產(chǎn)生不確定的答案,例如:
create table t (x int, y int);
insert into t (x,y) values (1,1),(1,2),(1,3);
select x,y from t group by x;
+------+------+
| x | y |
+------+------+
| 1 | 1 |
+------+------+
即,為組x選擇了隨機y??梢酝ㄟ^設置@@ sql_mode來防止此行為:
set @@sql_mode='ONLY_FULL_GROUP_BY';
select x,y from t group by x;
ERROR 1055 (42000): 'test.t.y' isn't in GROUP BY

TA貢獻1725條經(jīng)驗 獲得超8個贊
當然,最好的解決方案是使用完整的GROUP BY
表達式。
但是還有另一種解決方案,可以解決ONLY_FULL_GROUP_BY
對的舊MySQL擴展的阻塞GROUP BY
。
SELECT name, ANY_VALUE(type) type, ANY_VALUE(language) language, ANY_VALUE(code) code FROM users WHERE verified = '1' GROUP BY name ORDER BY count DESC LIMIT 0, 25
ANY_VALUE()
顯式聲明MySQL不完整GROUP BY
操作中曾經(jīng)隱含的內(nèi)容-服務器可以選擇任意值返回。

TA貢獻1824條經(jīng)驗 獲得超5個贊
首先是要了解為什么會這樣。較早的版本使我們有些疏忽:雖然結果中完全列出了分組列的值(每個列均無例外),但其他選定列的值或多或少被省略了-但是代碼可以不會(不想)代表您告訴哪些人:
- Hey, MYSQL, list the families of the street - but add a first name as well to every row.- Okay sir, but shall I use the father's or the mother's or...? I'm a machine, give exact orders!
現(xiàn)在我們了解了原因,我們可以決定是否對其他列有偏好。采用
MAX() ASMIN() ASetc, works with strings, too
或者,如果確實是一樣的話,例如與分組值相關的非聚合值之間沒有區(qū)別,請使用
ANY_VALUE() AS
無論哪種方式,您都讓mysql知道您知道自己是“模棱兩可的”,但您實際上不想將重點放在除您分組的列之外的所有列上。
添加回答
舉報