3 回答

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊
您需要有一個(gè)完整的小組:
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默認(rèn)情況下允許部分分組依據(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選擇了隨機(jī)y??梢酝ㄟ^設(shè)置@@ 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貢獻(xiàn)1725條經(jīng)驗(yàn) 獲得超8個(gè)贊
當(dāng)然,最好的解決方案是使用完整的GROUP BY
表達(dá)式。
但是還有另一種解決方案,可以解決ONLY_FULL_GROUP_BY
對的舊MySQL擴(kuò)展的阻塞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)容-服務(wù)器可以選擇任意值返回。

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超5個(gè)贊
首先是要了解為什么會這樣。較早的版本使我們有些疏忽:雖然結(jié)果中完全列出了分組列的值(每個(gè)列均無例外),但其他選定列的值或多或少被省略了-但是代碼可以不會(不想)代表您告訴哪些人:
- 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
或者,如果確實(shí)是一樣的話,例如與分組值相關(guān)的非聚合值之間沒有區(qū)別,請使用
ANY_VALUE() AS
無論哪種方式,您都讓mysql知道您知道自己是“模棱兩可的”,但您實(shí)際上不想將重點(diǎn)放在除您分組的列之外的所有列上。
添加回答
舉報(bào)