我花了几个小时寻找这个问题的解决方案,但没有任何运气.我有一张健身表,如下所示.健身表中的每个项目都可以有多个目标肌肉,这些目标肌肉列在目标肌肉表中.

健身表:

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

不应 Select 锻炼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

上面的查询也返回锻炼id=1,而不是只返回2.我如何实现这一点?

如有任何帮助,我们不胜感激.

推荐答案

跳过WHERE条款.使用HAVING来确保a和b正好在那里.

SELECT workouts.id
FROM workouts
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

还可以执行以下操作:

SELECT workouts.id
FROM workouts
JOIN target_muscles ON workouts.id = target_muscles.workout_id
GROUP BY workouts.id
HAVING MIN(target_muscles.muscle_key) = 'a'
   AND MAX(target_muscles.muscle_key) = 'b'
   AND COUNT(DISTINCT target_muscles.muscle_key) = 2

或者,也许表现不那么出色:

SELECT workouts.id
FROM workouts
JOIN (SELECT workout_id FROM target_muscles WHERE muscle_key = 'a'
      INTERSECT
      SELECT workout_id FROM target_muscles WHERE muscle_key = 'b'
      EXCEPT
      SELECT workout_id FROM target_muscles WHERE muscle_key NOT IN ('a', 'b')) dt
  ON workouts.id = dt.workout_id

Mysql相关问答推荐

是否有一种方法可以 Select 表中具有特定列值的行,该行还显示phpmyadmin中原始表中的行号?

SQL-从一个字段中 Select 值,但另一个字段中不包含零值

递归查询意外地为一个字段返回空值

如何查询一行

从表中动态删除所有空列

根据时间戳分组删除

获取每个参数的记录,不重复

特定时间段内每个客户的运行总计

如何编写按天数汇总值的sql查询?

仅计算 DATEDIFF (MySQL) 中的工作日

如何在 mysql 中获取 Day Wise 的平均值?

MySQL 根据另一列中的值更改空值

如何查看 rdsadmin 在 mysql 实例上的权限?

MySQL按连续值和计数分组

phpmyadmin没有收到要导入的数据错误,如何解决?

mysql中float(2,2)和float()的区别

外键可以引用非唯一索引吗?

MySQL 更新连接表

mysql错误'TYPE = MyISAM'

MySQL讲解查询理解