Как выбрать строки, которых нет в другой таблице? - PullRequest
0 голосов
/ 15 января 2019

У меня есть 3 таблицы:

stoffen

-------------------
| pot (PK) | naam | 
-------------------
| 1        | dust |
| 2        | iron |
| 3        | gold |
-------------------

stoftesten

-----------------------------------------------------------------------
| id (PK) | score | done | stofid (FK : pot) | userid (FK : username) |
-----------------------------------------------------------------------
| 1       | 75    | Ja   | 1                 | user01                 |
| 2       | 25    | Ja   | 2                 | user01                 |
| 3       | 85    | Ja   | 2                 | user02                 |
-----------------------------------------------------------------------

Пользователи

-------------------------------------------
| username (PK) | name | rol      | basis |
-------------------------------------------
| user01        | Ben  | geleider | VLB   |
| user02        | Tom  | geleider | GER   |
-------------------------------------------

Все эти 3 таблицы используются в этом запросе:

SELECT * 
FROM stoffen 
INNER JOIN stoftesten ON stoffen.pot = stoftesten.stofid 
INNER JOIN users ON users.username = stoftesten.gebruikersid 
WHERE stoftesten.done = 'Ja' and users.username = '$pers->username' 
ORDER BY naam";

Составляет список всех «stoffen», которые связаны с «stoftest». user01 получает список с пылью и железом, а user02 - список с железом.

Мне было интересно, есть ли способ составить список предметов, которых нет в этом списке, список неиспользуемых предметов. Итак, я сделал это:

SELECT * 
FROM stoffen 
LEFT JOIN stoftesten ON stoffen.pot = stoftesten.stofid 
LEFT JOIN users ON users.username = stoftesten.gebruikersid
WHERE stoftesten.gedaan IS NULL
ORDER BY stoffen.naam;

Это создает список, который я хотел, по крайней мере, так я и думал. Когда я вхожу в другую учетную запись, я получаю тот же список «нет в списке». Это понятно, потому что я не указал ни одного пользователя.

Но я не могу найти способ сделать это. Таблица «stoftesten» связывает «stoffen» и «пользователей». Есть ли способ показать только «stoffen», которых нет в списке, но разные для каждого пользователя?

1 Ответ

0 голосов
/ 15 января 2019

Используйте cross join для генерации всех строк. Затем используйте LEFT JOIN, чтобы получить совпадения и отфильтровать все строки, которые на самом деле соответствуют:

select s.pot, u.username
from stoffen s cross join
     users u left join
     stoffentesten st
     on s.pot = st.stofid and u.username = st.gebruikersid
where st.stofid is null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...