【MySQL】SELECT list is not in GROUP BY clause... 異常解決

遇到問題

  最近給公司某系統公衆號端開發新功能,其中涉及到的一個功能點就是要分組查詢每一個強電井最新的一條記錄,考慮到代碼量和代碼的複雜度,我直接使用了 MySQL 中的組內查詢,在本地測試運行程序可行,但當部署到測試服務器時出現了異常,拉取測試服務器日誌出現如下異常:
  
產生異常的緣由就是所寫組內查詢引發的:java

SELECT a.* FROM tbl_inspection_equipment_record a
RIGHT JOIN (
    SELECT * FROM tbl_inspection_equipment_record 
        WHERE state = 1
        AND build_id = ?
    ORDER BY end_time DESC
) AS temp
ON a.id = temp.id
GROUP BY room_id
ORDER BY end_time DESC

問題緣由

  MySQL 5.7.5及以上功能依賴檢測功能。若是啓用了 ONLY_FULL_GROUP_BY SQL 模式(默認狀況下),MySQL 將拒絕選擇列表,HAVING 條件或 ORDER BY 列表的查詢引用在 GROUP BY 子句中既未命名的非集合列,也不在功能上依賴於它們。(5.7.5以前,MySQL 沒有檢測到功能依賴關係,默認狀況下不啓用 ONLY_FULL_GROUP_BY。有關5.7.5以前的行爲的說明,請參見「MySQL 5.6參考手冊」。)mysql

解決方案

方法一(該方式每次mysql服務從新啓動恢復原來的模式)

  1 執行sql語句sql

select @@global.sql_mode;

  
  2 執行如下sql語句,去除步驟1中 ONLY_FULL_GROUP_BY 服務器

set @@global.sql_mode =
'STRICT_TRANS_TABLES,
NO_ZERO_IN_DATE,
NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO,
NO_AUTO_CREATE_USER,
NO_ENGINE_SUBSTITUTION';

方法二

  1 遠程服務器找到 my.cnf 文件
  
  2 在該文件的底部加入如下內容:測試

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

  3 重啓mysql服務ui

相關文章
相關標籤/搜索