На моем веб-сайте у меня есть таблица пользователей, основным ключом является username
. У меня есть таблица альбомов с идентификатором альбома и названием альбома. У меня также есть таблица user_albums, которая моделирует отношения многих пользователей, таких как многие альбомы.
Это запрос выбора, который возвращает альбомы, которым нравится определенный пользователь:
SELECT e.album_title
FROM user_albums d
INNER JOIN albums e ON d.album_id = e.album_id
WHERE d.user_id = $user
То, что я хочу, это тот же запрос, но я хочу, чтобы он возвращал все альбомы, которые ему не нравятся. Таким образом, в основном, выберите все альбомы, не входящие в этот запрос.
Что мне нужно изменить, чтобы сделать это?
Это означает НЕ EXISTS, "этот идентификатор пользователя не указан в пользовательских альбомах":
SELECT e.album_title FROM albums e
WHERE NOT EXISTS
( SELECT * FROM user_albums d
WHERE d.user_id = '$user'
AND d.album_id = e.album_id
)
Если вы не хотите использовать подзапрос, общим способом является использование OUTER JOIN/IS NULL:
SELECT e.album_title
FROM user_albums d
LEFT JOIN albums e
ON d.album_id = e.album_id
AND d.user_id = '$user' -- when there no match a NULL will be returned
WHERE d.album_id IS NULL; -- find that NULL
WHERE album_id NOT IN (select album_id from user_albums where user_id = '$user')
, который я считаю еще более читабельным.