MySQL: выберите оставшиеся строки - PullRequest
2 голосов
/ 19 марта 2010

Я искал это везде, но не могу найти решение. Возможно, я использую неправильные термины. В любом случае, я обращаюсь к старому доброму верному С.О. чтобы помочь мне найти ответ.

У меня есть две таблицы, мы будем называть их «tools» и «installs»

tools = id, name, version
installs = id, tool_id, user_id

В таблице «tools» перечислены доступные инструменты, которые затем устанавливаются пользователем и заносятся в таблицу «installs». Выбор установленных инструментов достаточно прост:

SELECT tools.name
  FROM tools
  LEFT JOIN installs
  ON tools.id = installs.tool_id
  WHERE user_id = 99 ;

Как выбрать остальные инструменты - те, которые еще не установлены пользователем # 99?

Извините, если это болезненно очевидно, но я просто не могу понять это! Спасибо за помощь!

1 Ответ

6 голосов
/ 19 марта 2010

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

   SELECT t.name
     FROM TOOLS t
LEFT JOIN INSTALLS i ON i.tool_id = t.id
                    AND i.user_id = 99
    WHERE i.id IS NULL

Также вы можете использовать NOT EXISTS:

SELECT t.name
  FROM TOOLS t
 WHERE NOT EXISTS(SELECT NULL 
                    FROM INSTALLS i
                   WHERE i.tool_id = t.id
                     AND i.user_id = 99)

... или NOT IN:

SELECT t.name
  FROM TOOLS t
 WHERE t.id NOT IN (SELECT i.tool_id
                      FROM INSTALLS i
                     WHERE i.user_id = 99)

Из трех вариантов LEFT JOIN/IS NULL является наиболее эффективным на MySQL. Подробнее об этом вы можете прочитать в этой статье .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...