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

如何通过关联表筛选同时包含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 22:13:28