【问题标题】:Matching Exactly all values in IN clause完全匹配 IN 子句中的所有值
【发布时间】:2023-01-15 10:14:51
【问题描述】:

我正在寻找这个问题的解决方案几个小时,但没有运气。我有一个锻炼表如下。锻炼表中的每个项目都可以有多个目标肌肉,这些目标肌肉列在“目标肌肉”表中。

锻炼表:

id
1
2

目标肌肉表:

id muscle_key workout_id
1 a 1
2 b 1
3 c 1
4 a 2
5 b 2

我需要获取锻炼表中的所有项目,这些项目完全匹配给定集合中的所有目标肌肉键,不多也不少。例如,给定一组肌肉键:

(a,b)

所需的输出将是:

id
2

不应该选择 workout id = 1 的行,因为它包含一个额外的肌肉键 (c)。

我正在使用以下查询:

SELECT id
FROM workouts
LEFT JOIN target_muscles ON workouts.id = target_muscles.workout_id
WHERE target_muscles.muscle_key IN (a,b)
GROUP BY workouts.id
HAVING COUNT(DISTINCT target_muscles.muscle_key) = 2

上面的查询也返回了 workout id = 1,而不仅仅是 2。我怎样才能做到这一点?

任何帮助表示赞赏。

【问题讨论】:

  • “不应选择 workout id = 1 的行”但我确实看到 3 行 workout_id=1 ?

标签: mysql sql


【解决方案1】:

跳过 WHERE 子句。使用 HAVING 确保 a 和 b 在那里。

SELECT workouts.id
FROM workouts
LEFT JOIN target_muscles ON workouts.id = target_muscles.workout_id
GROUP BY workouts.id
HAVING COUNT(DISTINCT target_muscles.muscle_key) =
       COUNT(DISTINCT CASE WHEN target_muscles.muscle_key IN (a,b)
                           THEN target_muscles.muscle_key END)
   AND COUNT(DISTINCT target_muscles.muscle_key) = 2

【讨论】:

    猜你喜欢
    • 2012-07-23
    • 2020-01-07
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多