Хорошо, вот мои таблицы: tests:
+----+------------+
| id | name |
+----+------------+
| 1 | test-one |
| 2 | test-two |
| 3 | test-three |
| 4 | test-four |
| 5 | test-five |
| 6 | test-six |
+----+------------+
testGroups:
+----+-------------+
| id | name |
+----+-------------+
| 1 | group-one |
| 2 | group-two |
| 3 | group-three |
| 4 | group-four |
| 5 | group-five |
| 6 | group-six |
| 7 | group-seven |
| 8 | group-eight |
| 9 | group-nine |
| 10 | group-ten |
+----+-------------+
и testGroupAssignments
+----+--------+---------+
| id | testID | groupID |
+----+--------+---------+
| 1 | 1 | 1 |
| 2 | 2 | 1 |
| 3 | 2 | 2 |
| 4 | 2 | 3 |
| 5 | 3 | 1 |
| 6 | 3 | 3 |
| 7 | 4 | 1 |
| 8 | 5 | 6 |
| 9 | 5 | 7 |
| 10 | 5 | 4 |
+----+--------+---------+
Что я хочу получить каждый test
, которому назначено group-one
, учитывая, что ему не назначена никакая другая группа.
+--------+-----------+
| testID | testName |
+--------+-----------+
| 1 | test-one |
| 4 | test-four |
+--------+-----------+
Я знаю, что должен использовать LEFT JOIN
, и я пытался сделать:
SELECT
t.id `testID`,
t.name `testName`
FROM
tests `t`
INNER JOIN
testGroupAssignments `tga`
ON
t.id = tga.testID
LEFT JOIN
testGroupAssignments `tga2`
ON
t.id = tga.testID AND tga2.groupID != 1
INNER JOIN
testGroups `tg`
ON
tg.id = tga.groupID
WHERE
tga.groupID = 1
AND
tga2.groupID != 1
AND
tga2.groupID IS NULL