You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含GROUP_CONCAT的MySQL视图在不同WHERE条件下查询结果不一致问题排查与解决咨询

视图查询结果不一致问题:GROUP_CONCAT与WHERE子句的交互异常

我最近创建了一个名为cases_keywords2的视图,但在使用不同的WHERE子句查询时,返回的结果出现了莫名其妙的不一致情况,具体如下:

第一次查询

执行语句:

select * from cases_keywords2 ck where case_id = 10732 or case_id = 10733 or case_id = 10740

返回结果:

case_idkeywords_idskeywords
107321,52,118sanity,automated,alm
10733
107401sanity

第二次查询

执行语句:

select * from cases_keywords2 ck where case_id = 10733 or case_id = 10740

返回结果:

case_idkeywords_idskeywords
10733
10740118alm

可以看到,case_id=10740的返回值完全变了,这明显不符合预期。

视图定义

这个cases_keywords2视图的创建SQL如下:

select `c`.`id` AS `case_id`, coalesce(group_concat(`t`.`id` separator ','), '') AS `keyword_ids`, coalesce(group_concat(`t`.`keyword` separator ','), '') AS `keywords` 
from (`synergy`.`case` `c` left join ( 
    select `ck`.`case_id` AS `case_id`, `k`.`id` AS `id`, `k`.`keyword` AS `keyword` 
    from (`synergy`.`case_has_keyword` `ck` join `synergy`.`keyword` `k` on ((`ck`.`keyword_id` = `k`.`id`)))) `t` on ((`c`.`id` = `t`.`case_id`))) 
group by `c`.`id`;

我的测试尝试

我试着把视图替换成它的源SQL并移除GROUP BY子句,执行后得到了预期的正确结果:

select `c`.`id` AS `case_id`,t.id,t.keyword 
from (`synergy`.`case` `c` left join ( 
    select `ck`.`case_id` AS `case_id`, `k`.`id` AS `id`, `k`.`keyword` AS `keyword` 
    from (`synergy`.`case_has_keyword` `ck` join `synergy`.`keyword` `k` on ((`ck`.`keyword_id` = `k`.`id`)))) `t` on ((`c`.`id` = `t`.`case_id`))) 
where c.id = 10732 or c.id = 10733 or c.id = 10740;

返回结果:

case_ididkeyword
107321sanity
1073252automated
10732118alm
10733
10740118alm

但只要重新添加GROUP BY子句,错误的结果就又出现了:

select `c`.`id` AS `case_id`, coalesce(group_concat(`t`.`id` separator ','), '') AS `keyword_ids`, coalesce(group_concat(`t`.`keyword` separator ','), '') AS `keywords` 
from (`synergy`.`case` `c` left join ( 
    select `ck`.`case_id` AS `case_id`, `k`.`id` AS `id`, `k`.`keyword` AS `keyword` 
    from (`synergy`.`case_has_keyword` `ck` join `synergy`.`keyword` `k` on ((`ck`.`keyword_id` = `k`.`id`)))) `t` on ((`c`.`id` = `t`.`case_id`))) 
where c.id = 10732 or c.id = 10733 or c.id = 10740 
group by `c`.`id`;

返回结果:

case_idkeywords_idskeywords
107321,52,118sanity,automated,alm
10733
107401sanity

求助问题

请问有没有办法可以避免视图与WHERE子句之间的这种交互影响?或者能否修改GROUP_CONCAT的调用方式,从而得到预期的正确结果?

内容的提问来源于stack exchange,提问作者Jiri Prox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 23:22:32