У меня есть следующие таблицы:
platforms(id,platformname)
games(id,title,platformid)
gameslists(id,memberid,gameid)
Я хотел бы выбрать все записи из таблицы игр, но исключить записи, в которых games.gameid присутствует в списках игр для определенного участника. Итак, на простом английском языке: выберите все записи из таблицы игр, кроме тех, где игровой файл присутствует в таблице gameslists, где член равен 999 (memberid будет получен из сеанса). Мне также нужно имя платформы, но я думаю, что простое внутреннее соединение.
Я пробовал это, и другие варианты, но безрезультатно!
SELECT DISTINCT games.id, platforms.platformname, gameslists.gameid
FROM games
INNER JOIN platforms ON games.platformid = platforms.id
INNER JOIN gameslists ON games.id = gameslists.gameid
WHERE platformid = 1 and gameslists.memberid <> 999
ORDER BY games.releasedate DESC
LIMIT 8
SELECT g.*
FROM GAMES g
LEFT JOIN GAMESLISTS gl ON gl.gameid = g.id
AND gl.memberid = ?
WHERE gl.id IS NULL
SELECT g.*
FROM GAMES g
WHERE g.id NOT IN (SELECT gl.gameid
FROM GAMESLISTS gl
WHERE gl.memberid = ?)
SELECT g.*
FROM GAMES g
WHERE NOT EXISTS(SELECT NULL
FROM GAMESLISTS gl
WHERE gl.gameid = g.id
AND gl.memberid = ?)
В MySQL LEFT JOIN/IS NULL - это наиболее эффективное средство для получения списка на основе того, что следует исключать, но только если сравниваемые столбцы не могут быть недействительными (значения в критериях соединения не могут быть нулевыми). В противном случае NOT IN и NOT EXISTS более эффективны.
Из-за внешних ключей маловероятно, что сравниваемые столбцы будут NULL, поэтому используйте LEFT JOIN/IS NULL. Но имейте в виду, что вам не нужно использовать JOINs специально для исключения данных.
Откажитесь от это руководство из Qaru очень собственное Jeff Atwood