Какой тип соединения MySQL мне нужно в следующем запросе

0

У меня есть следующие таблицы:

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
Теги:

2 ответа

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

Использование LEFT JOIN/IS NULL

   SELECT g.*
     FROM GAMES g
LEFT JOIN GAMESLISTS gl ON gl.gameid  = g.id
                       AND gl.memberid = ?
    WHERE gl.id IS NULL

Использование NOT IN

SELECT g.*
  FROM GAMES g
 WHERE g.id NOT IN (SELECT gl.gameid 
                      FROM GAMESLISTS gl
                     WHERE gl.memberid = ?)

Использование NOT EXISTS

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 специально для исключения данных.

  • 0
    Спасибо за это через объяснение! Это чрезвычайно полезно в будущем, и я ценю это.
1

Откажитесь от это руководство из Qaru очень собственное Jeff Atwood

  • 0
    Спасибо, это очень полезно!

Ещё вопросы

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