使用GROUP_CONCAT时SQL查询仅返回一行的原因及解决办法
问题原因
GROUP_CONCAT是SQL聚合函数,作用是将分组内多行指定字段的值拼接为单个字符串返回。当查询语句使用了聚合函数但未显式声明GROUP BY子句时,MySQL会默认将所有符合WHERE条件的行聚合为1行结果返回,这就是你添加GROUP_CONCAT后仅返回一行、删除后恢复多行返回的根本原因。
解决方案
- 补充GROUP BY分组规则
你需要根据业务逻辑指定分组字段,当前场景下你期望每条show_horses记录返回一行,同时拼接关联的繁育者和所有者信息,只需在WHERE条件后添加GROUP BY子句,按show_horses的唯一标识分组即可。
如果你的MySQL开启了ONLY_FULL_GROUP_BY严格模式,需要将SELECT子句中所有非聚合的字段都加入GROUP BY列表,避免语法报错。
修改后的查询代码参考:
$select = <<<EOT `show_horses`.`sys_id`, `show_horses`.`group_sys_id`, `show_horses`.`horse_number`, `horses`.`sys_id` as `horse_sys_id`, `horses`.`name` as `horse_name`, `horses`.`f_name`, `show_points`.`total`, `show_points`.`exp`, `show_points`.`sum`, GROUP_CONCAT(DISTINCT `breeder`.`full_name` SEPARATOR ' - ') as breeder, GROUP_CONCAT(DISTINCT `breeder`.`f_full_name` SEPARATOR ' - ') as f_breeder, GROUP_CONCAT(DISTINCT `owner`.`full_name` SEPARATOR ' - ') as owner, GROUP_CONCAT(DISTINCT `owner`.`f_full_name` SEPARATOR ' - ') as f_owner EOT; $query = <<<EOT SELECT $select FROM `show_horses` LEFT JOIN `horses` ON `show_horses`.`horse_sys_id` = `horses`.`sys_id` LEFT JOIN `show_points` ON `show_horses`.`sys_id` = `show_points`.`sys_id` AND `horses`.`sys_id` = `show_points`.`horse_sys_id` LEFT JOIN `pivot_users_horses` as `pbreeder` ON `show_horses`.`horse_sys_id` = `pbreeder`.`horse_sys_id` AND `pbreeder`.`relation` = 'breeders' LEFT JOIN `pivot_users_horses` as `powner` ON `show_horses`.`horse_sys_id` = `powner`.`horse_sys_id` AND `powner`.`relation` = 'owners' LEFT JOIN `users` as `breeder` ON `pbreeder`.`user_sys_id` = `breeder`.`sys_id` LEFT JOIN `users` as `owner` ON `powner`.`user_sys_id` = `owner`.`sys_id` WHERE (`horses`.`f_name` LIKE ? OR `horses`.`name` LIKE ? OR `horses`.`f_name` LIKE ? OR `breeder`.`full_name` LIKE ? OR `breeder`.`f_full_name` LIKE ? OR `owner`.`full_name` LIKE ? OR `owner`.`f_full_name` LIKE ?) AND `show_horses`.`sys_id` = ? GROUP BY `show_horses`.`sys_id`, `show_horses`.`group_sys_id`, `show_horses`.`horse_number`, `horse_sys_id`, `horse_name`, `f_name`, `total`, `exp`, `sum`; EOT;
- 调整GROUP_CONCAT长度限制(可选)
MySQL默认group_concat_max_len配置值为1024字节,若拼接的内容过长会被自动截断,你可以在执行查询前执行以下语句调整当前会话的长度限制:
SET SESSION group_concat_max_len = 102400;
内容的提问来源于stack exchange,提问作者reza
相关产品推荐
相关产品推荐

