基於【 bug解決】一 || mysql的ONLY_FULL_GROUP_BY致使的sql語句錯誤

1、Mysql錯誤: 

In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'ynsl_new.u.user_id'; this is incompatible with sql_mode=only_full_group_byjava

一、原sql語句: mysql

SET @data_id='153f61e9727b450d8abbba5941e5085a';
SELECT
          u.*,
          GROUP_CONCAT(r.ROLE_CODE SEPARATOR ',') AS roleCode
      FROM
          tab_user u
          LEFT JOIN tab_user_role_relation ur ON ur.user_id = u.user_id
          LEFT JOIN tab_role r ON r.role_id = ur.role_id
      WHERE
          u.delete_mark = 0
          AND u.enable_mark = 1
          AND u.data_id = @data_id

  

二、中文大概意思:sql

在不帶GROUP BY的聚合查詢中,選擇列表的表達式1包含未聚合的列「ynsl_new.u.user_id」;這與SQL_mode=only_full_group_by不兼容express

也就是說,mysql的sql_mode是only_full_group_by的時候,在不使用group by 而且select後面出現彙集函數的話,那麼全部被select的都應該是彙集函數,不然就會報錯;函數

 

三、出現的緣由: this

在MySQL5.7.5後,默認開啓了ONLY_FULL_GROUP_BY,因此致使了以前的一些SQL沒法正常執行,其實,是咱們的SQL不規範形成的,由於group by 以後,返回的一些數據是不肯定的,因此纔會出現這個錯誤。spa

 

2、解決方案: 

一、關閉ONLY_FULL_GROUP_BYblog

在配置文件中,找到sql_mode,去掉only_full_group_byget

 

二、規範sql語句,使用group byit

SET @data_id='153f61e9727b450d8abbba5941e5085a';
SELECT
          u.*,
          GROUP_CONCAT(r.ROLE_CODE SEPARATOR ',') AS roleCode
      FROM
          tab_user u
          LEFT JOIN tab_user_role_relation ur ON ur.user_id = u.user_id
          LEFT JOIN tab_role r ON r.role_id = ur.role_id
      WHERE
          u.delete_mark = 0
          AND u.enable_mark = 1
          AND u.data_id = @data_id
      GROUP BY u.user_id ;
相關文章
相關標籤/搜索