Выберите элементы, которые пользователю НЕ нравятся

0

На моем веб-сайте у меня есть таблица пользователей, основным ключом является 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

То, что я хочу, это тот же запрос, но я хочу, чтобы он возвращал все альбомы, которые ему не нравятся. Таким образом, в основном, выберите все альбомы, не входящие в этот запрос.

Что мне нужно изменить, чтобы сделать это?

Теги:

1 ответ

2
Лучший ответ

Это означает НЕ 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
  • 0
    Есть ли способ сделать это без подзапроса.
  • 0
    @Milo. Такой запрос обычно легче читать с помощью подзапроса. EXISTS использует коррелированный подзапрос, т.е. вы ссылаетесь на внешнюю таблицу в этом подзапросе. Вы можете сделать то же самое с некоррелированным подзапросом с IN: WHERE album_id NOT IN (select album_id from user_albums where user_id = '$user') , который я считаю еще более читабельным.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню