JSON_ARRAYAGG与WHERE子句联用异常:筛选车场时丢失用户全关联数据
解决方案
你需要先筛选出关联了目标停车场的用户,再基于这些用户去关联他们所有的停车场数据,而非直接在主查询的WHERE子句中过滤停车场记录。
示例SQL(IN子查询方式)
SELECT cu.id, cu.name, JSON_ARRAYAGG(pak_all) AS user_parkings FROM `Contractor Users` cu -- 子查询先锁定关联了parking_a的用户 WHERE cu.id IN ( SELECT DISTINCT cu_inner.id FROM `Contractor Users` cu_inner LEFT JOIN Parkings pak_inner ON FIND_IN_SET(pak_inner.id, cu_inner.parking_ids) WHERE pak_inner.name = 'parking_a' ) -- 关联该用户的所有停车场,聚合完整数据 LEFT JOIN Parkings pak_all ON FIND_IN_SET(pak_all.id, cu.parking_ids) GROUP BY cu.id, cu.name;
示例SQL(JOIN子查询方式)
如果更倾向于用JOIN逻辑筛选用户,也可以这么写:
SELECT cu.id, cu.name, JSON_ARRAYAGG(pak_all) AS user_parkings FROM `Contractor Users` cu -- 通过子查询筛选出符合条件的用户,再关联主表 JOIN ( SELECT DISTINCT cu_inner.id FROM `Contractor Users` cu_inner LEFT JOIN Parkings pak_inner ON FIND_IN_SET(pak_inner.id, cu_inner.parking_ids) WHERE pak_inner.name = 'parking_a' ) filtered_users ON cu.id = filtered_users.id LEFT JOIN Parkings pak_all ON FIND_IN_SET(pak_all.id, cu.parking_ids) GROUP BY cu.id, cu.name;
逻辑说明
- 子查询的作用是精准定位所有关联了
parking_a的用户ID,确保最终结果只保留这些符合条件的用户。 - 主查询基于筛选后的用户列表,重新关联他们的全部停车场记录,这样
JSON_ARRAYAGG就能聚合用户的所有关联停车场数据,不会被筛选条件截断。
内容的提问来源于stack exchange,提问作者Akhil Rana
相关产品推荐
相关产品推荐

