理解 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中文网其他相关文章!