MySQL - 选择全部除了此表中的内容

Dav*_*vid 1 mysql sql

我想要选择用户尚未拥有的所有图像.

我有三个表:user,image,和user_image:

  • _user(id,user,pass)
  • _image(id,data)
  • _user_image(id,user_id,image_id)

OMG*_*ies 6

运用 LEFT JOIN/IS NULL


   SELECT DISTINCT
          i.data
     FROM IMAGE i
     JOIN USER_IMAGE ui ON ui.image_id = i.id
LEFT JOIN USER u ON u.id = ui.user_id
                AND u.user = ?
    WHERE u.id IS NULL
Run Code Online (Sandbox Code Playgroud)

运用 NOT IN


SELECT DISTINCT
       i.data
  FROM IMAGE i
  JOIN USER_IMAGE ui ON ui.image_id = i.id
 WHERE ui.user_id NOT IN (SELECT u.id
                            FROM USER u
                           WHERE u.user = ?)
Run Code Online (Sandbox Code Playgroud)

运用 NOT EXISTS


SELECT DISTINCT
       i.data
  FROM IMAGE i
  JOIN USER_IMAGE ui ON ui.image_id = i.id
 WHERE NOT EXISTS(SELECT NULL
                    FROM USER u
                   WHERE u.id = ui.user_id
                     AND u.user = ?)
Run Code Online (Sandbox Code Playgroud)

性能:


LEFT JOIN/IS NULLNOT IN提供相当的性能-的NOT EXISTS是〜30%的效率低. 有关详细信息,请参阅本.