欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL出現(xiàn)1055錯誤:ONLY_FULL_GROUP_BY的問題解決

 更新時間:2025年07月29日 08:21:04   作者:一勺菠蘿丶  
當(dāng)你執(zhí)行SQL查詢時突然遇到"1055 - Expression #1 of SELECT list is not in GROUP BY clause…"錯誤,該怎么辦呢,下面小編就來和大家簡單講講吧

當(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)文章

  • SQL SERVER 日期格式轉(zhuǎn)換詳解

    SQL SERVER 日期格式轉(zhuǎn)換詳解

    本篇文章是對SQL SERVER 日期格式轉(zhuǎn)換進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • MySQL?8.0.29?解壓版安裝配置方法圖文教程

    MySQL?8.0.29?解壓版安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了MySQL?8.0.29?解壓版安裝配置方法圖文教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • MySQL如何快速修改表的表結(jié)構(gòu)

    MySQL如何快速修改表的表結(jié)構(gòu)

    這篇文章主要介紹了MySQL如何快速修改表的表結(jié)構(gòu),幫助大家更好的理解和學(xué)習(xí)MySQL,感興趣的朋友可以了解下
    2020-08-08
  • 給MySQL表中的字段設(shè)置默認(rè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
  • Linux中安裝MySQL5.7.42的詳細(xì)教程

    Linux中安裝MySQL5.7.42的詳細(xì)教程

    這篇文章主要介紹了Linux中安裝MySQL5.7.42,本文通過實例圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • MySQL InnoDB存儲引擎的深入探秘

    MySQL InnoDB存儲引擎的深入探秘

    這篇文章主要給大家介紹了關(guān)于MySQL InnoDB存儲引擎的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • Mysql排序的特性詳情

    Mysql排序的特性詳情

    這篇文章主要介紹Mysql排序的特性,新寫了一個功能,自測和測試環(huán)境測試都沒問題,但在生產(chǎn)環(huán)境會出現(xiàn)偶發(fā)問題。于是,加班到12點一直排查問題,終于定位了的問題原因:Mysql Limit查詢優(yōu)化導(dǎo)致?,F(xiàn)抽象出問題模型及解決方案,分析給大家,避免大家踩坑,需要的朋友可以參考一下
    2021-10-10
  • MySQL存儲過程的概念與用法實例

    MySQL存儲過程的概念與用法實例

    我們常用的操作數(shù)據(jù)庫語言SQL語句在執(zhí)行的時候需要要先編譯,然后執(zhí)行,而存儲過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,下面這篇文章主要給大家介紹了關(guān)于MySQL存儲過程的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • Mysql中Json相關(guān)的函數(shù)使用

    Mysql中Json相關(guān)的函數(shù)使用

    本文主要介紹了Mysql當(dāng)中Json相關(guān)的函數(shù)使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • MySQL存儲過程的異常處理方法

    MySQL存儲過程的異常處理方法

    這篇文章主要介紹了MySQL存儲過程的異常處理方法,可實現(xiàn)有效調(diào)試MySQL存儲過程處理結(jié)果的功能,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07

最新評論