MySQL:选择剩余的行

bjo*_*k24 2 mysql sql join

我到处寻找这个,但我似乎无法找到解决方案.也许我使用的是错误的条款.无论哪种方式,我都转向善于"信任",以帮助我找到答案.

我有两张桌子,我们称之为'工具'和'安装'

tools = id, name, version
installs = id, tool_id, user_id
Run Code Online (Sandbox Code Playgroud)

"工具"表记录了可用的工具,然后由用户安装并记录在"安装"表中.选择已安装的工具非常简单:

SELECT tools.name
  FROM tools
  LEFT JOIN installs
  ON tools.id = installs.tool_id
  WHERE user_id = 99 ;
Run Code Online (Sandbox Code Playgroud)

如何选择剩余的工具 - 用户#99尚未安装的工具?

如果这很痛苦,我很抱歉,但我似乎无法弄明白!谢谢您的帮助!

OMG*_*ies 6

使用:

   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
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用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)
Run Code Online (Sandbox Code Playgroud)

......或者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)
Run Code Online (Sandbox Code Playgroud)

在这三个选项中,LEFT JOIN/IS NULLMySQL的效率最高. 您可以在本文中阅读更多相关信息.