瞭解SELECT 最佳化問題
在MySQL 中,使用GROUP BY 子句時,必須將所有非聚合列包含在功能上不依賴分組列的SELECT 清單。這是透過 sql_mode=only_full_group_by 設定強制執行的。
當執行查詢:
SELECT * FROM `tbl_customer_pod_uploads` WHERE `load_id` = '78' AND `status` = 'Active' GROUP BY `proof_type`
時,它違反了此規則,因為 id 列不包含在 GROUP BY 子句中。這會導致錯誤:
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'returntr_prod.tbl_customer_pod_uploads.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
解決方案選項
要解決此問題,有多個選項:
1。停用 only_full_group_by 模式:
這可以使用以下命令完成:
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
但是,不建議這樣做,因為它可能會導致結果不準確。
2.在GROUP BY 子句中包含所有列:
此選項透過在GROUP BY 子句中明確包含所有非聚合列來確保符合only_full_group_by模式:
SELECT * FROM `tbl_customer_pod_uploads` WHERE `load_id` = '78' AND `status` = 'Active' GROUP BY `proof_type`, `id`
3.使用聚合函數:
查詢可以利用聚合函數從分組行中提取數據,而不是選擇特定列,從而在遵循最佳實踐的同時解決問題:
SELECT `proof_type`, COUNT(*) AS `row_count` FROM `tbl_customer_pod_uploads` WHERE `load_id` = '78' AND `status` = 'Active' GROUP BY `proof_type`
這種方法可以避免檢索不必要的資料並優化效能。
以上是為什麼我的 MySQL GROUP BY 查詢會產生「only_full_group_by」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!