MySQL出現(xiàn)1055錯誤:ONLY_FULL_GROUP_BY的問題解決
當(dāng)你執(zhí)行SQL查詢時突然遇到"1055 - Expression #1 of SELECT list is not in GROUP BY clause…"錯誤,是不是一臉懵?別擔(dān)心!這篇文章將用最簡單的語言解釋這個MySQL 8.0常見錯誤的原因和解決方案,即使你是SQL小白也能輕松搞定!
錯誤重現(xiàn):典型的報錯場景
SELECT product_id, product_name, pic, sp_data, SUM(quantity) AS total_sales FROM order_items GROUP BY sku_id; -- 這里只按sku_id分組
錯誤信息:
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
一、錯誤原因解析(小學(xué)生也能懂!)
想象你有一盒彩色鉛筆(數(shù)據(jù)庫表),里面有:
- 鉛筆型號(sku_id)
- 鉛筆顏色(product_name)
- 生產(chǎn)批次(product_id)
- 鉛筆圖片(pic)
現(xiàn)在老板要求:“按鉛筆型號分組,統(tǒng)計每種型號的總數(shù)量,同時顯示顏色、批次和圖片”
問題來了:
- 同一型號可能有不同顏色(比如型號A001有紅色和藍(lán)色)
- 分組后,MySQL不知道該顯示紅色還是藍(lán)色
- 這就是 ONLY_FULL_GROUP_BY 模式的作用 - 防止數(shù)據(jù)混亂!
核心原因:SELECT中的列(如product_name)沒有出現(xiàn)在GROUP BY中,MySQL無法確定取哪個值
二、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)點:
- 完全符合SQL標(biāo)準(zhǔn)
- 數(shù)據(jù)100%準(zhǔn)確
- 適合所有MySQL版本
缺點:
GROUP BY列表較長
方案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 -- 只需分組一列
適用場景:
- 當(dāng)同一sku_id對應(yīng)的其他列值相同時
- 需要優(yōu)化查詢性能時
重要提示:
- 如果同一sku_id有不同顏色,MAX()會取字母排序最后的顏色(如"藍(lán)色">“紅色”)
- 使用前需確認(rèn)業(yè)務(wù)邏輯是否允許
方案3:臨時關(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 ... (原始問題語句)
強烈不推薦:
- 可能導(dǎo)致數(shù)據(jù)隨機顯示
- 每次重連數(shù)據(jù)庫都要重新設(shè)置
- 生產(chǎn)環(huán)境絕對禁止!
三、原問題SQL修復(fù)完整版
SELECT item.product_id, item.product_name, item.pic, item.sp_data, SUM(item.quantity) AS total_sales -- 去掉IFNULL更簡潔 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ù)防措施 & 最佳實踐
1.設(shè)計表結(jié)構(gòu)時:
-- 確保sku_id能唯一確定商品信息 ALTER TABLE products ADD UNIQUE (sku_id);
2.永久修改sql_mode(慎重?。?/strong>
-- 編輯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.開發(fā)規(guī)范:
所有SELECT的非聚合列必須出現(xiàn)在GROUP BY中
使用別名時特別注意:
SELECT product_id AS id, -- 別名 ... GROUP BY product_id -- 必須用原始列名!
總結(jié):選擇哪種方案?
| 情況 | 推薦方案 | 原因 |
|---|---|---|
| 生產(chǎn)環(huán)境 | 方案1(完善GROUP BY) | 數(shù)據(jù)絕對安全 |
| 測試環(huán)境 | 方案2(使用MAX) | 執(zhí)行更快 |
| 緊急調(diào)試 | 方案3(關(guān)閉嚴(yán)格模式) | 快速驗證 |
記住這個黃金法則:GROUP BY中的列,應(yīng)該能唯一確定SELECT中的其他列。遵循這個原則,你將永遠(yuǎn)告別1055錯誤!
到此這篇關(guān)于MySQL出現(xiàn)1055錯誤:ONLY_FULL_GROUP_BY的問題解決的文章就介紹到這了,更多相關(guān)MySQL 1055錯誤解決內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
給MySQL表中的字段設(shè)置默認(rèn)值的兩種方法
在MySQL中,我們可以為表的字段設(shè)置默認(rèn)值,以確保在插入新記錄時,如果沒有為該字段指定值,將使用默認(rèn)值,要為MySQL表中的字段設(shè)置默認(rèn)值,我們可以在創(chuàng)建表時或者在已存在的表上使用ALTER TABLE語句進(jìn)行修改,下面將展示兩種設(shè)置默認(rèn)值的方法,需要的朋友可以參考下2023-11-11

