MySQL Group_Concat 不在

MySQL Group_Concat Not In

我没能找到一个类似的问题和我可以使用的答案,希望我没有忽略另一个问题。

我想构建一个查询,其中 return 个值不在 group_concat 中的项目。让我举个例子:

我有一个table的练习:

id  |  ExerciseName
---------------------
1   |  Squat
2   |  Deadlift
3   |  Bench Press
4   |  Deadlift Hex Bar

然后我有一个单独的 table 显示每个使用的设备:

id  | ExerciseId  |  EquipmentId
---------------------------------
1   | 1           | 1
2   | 1           | 20
3   | 2           | 1
4   | 3           | 47

那我有一个单独的table,显示每个设备的名字是什么:

id  | name_en
-------------
1   | Barbell
2   | Squat Rack
3   | Dumbbell

现在,我有一个查询,我是 运行,可以 select 练习,我想查询用户可以使用设备的练习。因此,假设用户没有 ID = 1 的设备。那么我只想 return 练习 3。目前,在我的查询中,我得到练习 1 和 3,它这样做是因为练习 1 确实有设备 ID = 1,但它还有另一个不等于设备 ID = 1(因为它是 Id = 20 ).

SELECT
    we.id ExerciseId,
    we.name_en ExerciseName
    GROUP_CONCAT(DISTINCT weeq.name_en ORDER BY weeq.name_en SEPARATOR ', ') Equipment
    FROM workouts_exercise we
JOIN workouts_exercise_equipment weeq ON weeq.exercise_id = we.id
JOIN workouts_equipment weq ON weq.id = weeq.equipment_id
WHERE weq.id NOT IN ("1")
GROUP BY we.id

如前所述,结果是这样的:

ExerciseId  | ExerciseName   | Equipment
------------------------------------------
1           | Squat          | 20
3           | Bench Press    | 47

而在现实中,我想要的只是:

ExerciseId  | ExerciseName   | Equipment
------------------------------------------
3           | Bench Press    | 47

一种方法是使用反加入来过滤掉使用您要排除的一种或多种设备的练习:

SELECT
    we1.ExerciseId,
    ex.ExerciseName,
    we1.EquipmentId AS Equipment
FROM workouts_equipment we1
LEFT JOIN workouts_equipment we2
    ON we1.ExerciseId = we2.ExerciseId AND
       we2.EquipmentId IN (1)
INNER JOIN workouts_exercise ex
    ON we1.ExerciseId = ex.id
WHERE
    we2.ExerciseId IS NULL;

Demo

您想排除需要设备 1 的练习。您可以使用 NOT INNOT EXISTS

select weeq.exerciseid, we.exercisename, weq.name_en as equipment
from workouts_exercise we
join workouts_exercise_equipment weeq on weeq.exerciseid = we.id
join workouts_equipment weq on weq.id = weeq.equipmentid
where we.id not in
(
  select exerciseid from workouts_exercise_equipment where equipmentid = 1
)