MySQL出現(xiàn)1055錯(cuò)誤:ONLY_FULL_GROUP_BY的問(wèn)題解決
當(dāng)你執(zhí)行SQL查詢時(shí)突然遇到"1055 - Expression #1 of SELECT list is not in GROUP BY clause…"錯(cuò)誤,是不是一臉懵?別擔(dān)心!這篇文章將用最簡(jiǎn)單的語(yǔ)言解釋這個(gè)MySQL 8.0常見(jiàn)錯(cuò)誤的原因和解決方案,即使你是SQL小白也能輕松搞定!
錯(cuò)誤重現(xiàn):典型的報(bào)錯(cuò)場(chǎng)景
SELECT product_id, product_name, pic, sp_data, SUM(quantity) AS total_sales FROM order_items GROUP BY sku_id; -- 這里只按sku_id分組
錯(cuò)誤信息:
1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'ry-mall.item.product_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
一、錯(cuò)誤原因解析(小學(xué)生也能懂!)
想象你有一盒彩色鉛筆(數(shù)據(jù)庫(kù)表),里面有:
- 鉛筆型號(hào)(sku_id)
- 鉛筆顏色(product_name)
- 生產(chǎn)批次(product_id)
- 鉛筆圖片(pic)
現(xiàn)在老板要求:“按鉛筆型號(hào)分組,統(tǒng)計(jì)每種型號(hào)的總數(shù)量,同時(shí)顯示顏色、批次和圖片”
問(wèn)題來(lái)了:
- 同一型號(hào)可能有不同顏色(比如型號(hào)A001有紅色和藍(lán)色)
- 分組后,MySQL不知道該顯示紅色還是藍(lán)色
- 這就是 ONLY_FULL_GROUP_BY 模式的作用 - 防止數(shù)據(jù)混亂!
核心原因:SELECT中的列(如product_name)沒(méi)有出現(xiàn)在GROUP BY中,MySQL無(wú)法確定取哪個(gè)值
二、3種解決方案(附詳細(xì)示例)
方案1:完善GROUP BY子句(推薦??????????)
SELECT product_id, product_name, pic, sp_data, SUM(quantity) AS total_sales FROM order_items GROUP BY sku_id, -- 原始分組列 product_id, -- 新增 product_name, -- 新增 pic, -- 新增 sp_data -- 新增
優(yōu)點(diǎn):
- 完全符合SQL標(biāo)準(zhǔn)
- 數(shù)據(jù)100%準(zhǔn)確
- 適合所有MySQL版本
缺點(diǎn):
GROUP BY列表較長(zhǎng)
方案2:使用聚合函數(shù)(高效方案????????)
SELECT MAX(product_id) AS product_id, -- 使用MAX取值 MAX(product_name) AS product_name, -- 使用MAX取值 MAX(pic) AS pic, MAX(sp_data) AS sp_data, SUM(quantity) AS total_sales FROM order_items GROUP BY sku_id -- 只需分組一列
適用場(chǎng)景:
- 當(dāng)同一sku_id對(duì)應(yīng)的其他列值相同時(shí)
- 需要優(yōu)化查詢性能時(shí)
重要提示:
- 如果同一sku_id有不同顏色,MAX()會(huì)取字母排序最后的顏色(如"藍(lán)色">“紅色”)
- 使用前需確認(rèn)業(yè)務(wù)邏輯是否允許
方案3:臨時(shí)關(guān)閉嚴(yán)格模式(應(yīng)急方案??)
-- 第一步:查看當(dāng)前模式 SELECT @@sql_mode; -- 第二步:移除ONLY_FULL_GROUP_BY SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; -- 第三步:執(zhí)行原SQL SELECT ... (原始問(wèn)題語(yǔ)句)
強(qiáng)烈不推薦:
- 可能導(dǎo)致數(shù)據(jù)隨機(jī)顯示
- 每次重連數(shù)據(jù)庫(kù)都要重新設(shè)置
- 生產(chǎn)環(huán)境絕對(duì)禁止!
三、原問(wèn)題SQL修復(fù)完整版
SELECT item.product_id, item.product_name, item.pic, item.sp_data, SUM(item.quantity) AS total_sales -- 去掉IFNULL更簡(jiǎn)潔 FROM oms_order_item item INNER JOIN oms_order o ON o.id = item.order_id -- 改用INNER JOIN WHERE o.STATUS IN (1, 2, 3) AND item.create_time >= '2025-07-28 00:00:00' AND item.create_time < '2025-07-29 00:00:00' GROUP BY item.sku_id, item.product_id, -- 關(guān)鍵修復(fù)! item.product_name, -- 關(guān)鍵修復(fù)! item.pic, -- 關(guān)鍵修復(fù)! item.sp_data -- 關(guān)鍵修復(fù)! ORDER BY total_sales DESC LIMIT 10;
四、預(yù)防措施 & 最佳實(shí)踐
1.設(shè)計(jì)表結(jié)構(gòu)時(shí):
-- 確保sku_id能唯一確定商品信息 ALTER TABLE products ADD UNIQUE (sku_id);
2.永久修改sql_mode(慎重!):
-- 編輯MySQL配置文件 my.cnf: [mysqld] sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
3.開(kāi)發(fā)規(guī)范:
所有SELECT的非聚合列必須出現(xiàn)在GROUP BY中
使用別名時(shí)特別注意:
SELECT product_id AS id, -- 別名 ... GROUP BY product_id -- 必須用原始列名!
總結(jié):選擇哪種方案?
| 情況 | 推薦方案 | 原因 |
|---|---|---|
| 生產(chǎn)環(huán)境 | 方案1(完善GROUP BY) | 數(shù)據(jù)絕對(duì)安全 |
| 測(cè)試環(huán)境 | 方案2(使用MAX) | 執(zhí)行更快 |
| 緊急調(diào)試 | 方案3(關(guān)閉嚴(yán)格模式) | 快速驗(yàn)證 |
記住這個(gè)黃金法則:GROUP BY中的列,應(yīng)該能唯一確定SELECT中的其他列。遵循這個(gè)原則,你將永遠(yuǎn)告別1055錯(cuò)誤!
到此這篇關(guān)于MySQL出現(xiàn)1055錯(cuò)誤:ONLY_FULL_GROUP_BY的問(wèn)題解決的文章就介紹到這了,更多相關(guān)MySQL 1055錯(cuò)誤解決內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL參數(shù)優(yōu)化信息參考(my.cnf參數(shù)優(yōu)化)
下面針對(duì)一些參數(shù)進(jìn)行說(shuō)明,當(dāng)然還有其它的設(shè)置可以起作用,取決于你的負(fù)載或硬件:在慢內(nèi)存和快磁盤(pán)、高并發(fā)和寫(xiě)密集型負(fù)載情況下,你將需要特殊的調(diào)整2024-07-07
簡(jiǎn)單聊一聊SQL中的union和union?all
在寫(xiě)SQL的時(shí)候,偶爾會(huì)用到兩個(gè)表的數(shù)據(jù)結(jié)合在一起返回的,就需要用到UNION 和 UNION ALL,這篇文章主要給大家介紹了關(guān)于SQL中union和union?all的相關(guān)資料,需要的朋友可以參考下2023-02-02
mysql中insert與select的嵌套使用解決組合字段插入問(wèn)題
本節(jié)主要介紹了mysql中insert與select的嵌套使用解決組合字段插入問(wèn)題,需要的朋友可以參考下2014-07-07
mysql between實(shí)現(xiàn)選取介于兩個(gè)值之間的數(shù)據(jù)范圍
這篇文章主要介紹了mysql between實(shí)現(xiàn)選取介于兩個(gè)值之間的數(shù)據(jù)范圍,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
Window Docker 安裝MySQL8.0的過(guò)程詳解
本文給大家介紹在Windows環(huán)境下安裝Docker并配置MySQL容器的全流程介紹,過(guò)程中還涉及到文件映射和客戶端連接MySQL的操作,感興趣的朋友跟隨小編一起看看吧2024-11-11

