如何通过关联表筛选同时包含age与gender目标的分组?
筛选同时包含指定多个目标的分组
原SQL语句无法返回结果的原因很直接:试图让同一行的targets.name同时等于'age'和'gender',而单条记录的字段不可能同时拥有两个不同值,因此条件永远不成立。
以下是几种可行的解决方案,都能筛选出同时包含gender和age目标的分组(即分组1):
方法一:分组统计结合HAVING子句
SELECT g.* FROM groups g INNER JOIN groups_targets gt ON gt.group_id = g.id INNER JOIN targets t ON t.id = gt.target_id WHERE g.user_id = 1 AND t.name IN ('age', 'gender') GROUP BY g.id, g.user_id -- 需包含groups表中所有非聚合字段 HAVING COUNT(DISTINCT t.name) = 2
- 逻辑:先筛选出包含
age或gender的分组记录,按分组ID分组后,统计该分组下不同目标名称的数量。当数量等于2时,说明该分组同时包含两个目标。
方法二:多次内连接
SELECT DISTINCT g.* FROM groups g INNER JOIN groups_targets gt1 ON gt1.group_id = g.id INNER JOIN targets t1 ON t1.id = gt1.target_id AND t1.name = 'gender' INNER JOIN groups_targets gt2 ON gt2.group_id = g.id INNER JOIN targets t2 ON t2.id = gt2.target_id AND t2.name = 'age' WHERE g.user_id = 1
- 逻辑:通过两次关联关联表和目标表,分别匹配
gender和age目标。只有同时满足两个关联条件的分组,才会出现在最终结果中。
方法三:EXISTS子查询验证
SELECT g.* FROM groups g WHERE g.user_id = 1 AND EXISTS ( SELECT 1 FROM groups_targets gt INNER JOIN targets t ON t.id = gt.target_id WHERE gt.group_id = g.id AND t.name = 'gender' ) AND EXISTS ( SELECT 1 FROM groups_targets gt INNER JOIN targets t ON t.id = gt.target_id WHERE gt.group_id = g.id AND t.name = 'age' )
- 逻辑:用两个独立的EXISTS子查询,分别验证当前分组是否包含
gender和age目标。只有两个验证都通过的分组才会被选中。
内容的提问来源于stack exchange,提问作者evans
相关产品推荐
相关产品推荐

