sql - MySQL - 选择除此表中的内容以外的所有内容

标签 sql mysql

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

我有三个表:userimageuser_image:

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

最佳答案

使用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

使用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 = ?)

使用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 = ?)

性能:


LEFT JOIN/IS NULLNOT IN 提供等效的性能 - NOT EXISTS 的效率低约 30%。 See this for more details .

关于sql - MySQL - 选择除此表中的内容以外的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2106372/

相关文章:

sql - 在表名中使用连字符 (-) 创建 Hive 表

sql - SELECT sql 返回 3 行列中值的总和作为第二列值,依此类推

mysql - 尝试在 SSRS 报告中选择特定列

MySQL 查询优化 - distinct、order by 和 limit

MySQL:按ID选择行,按日期选择上一行和下一行

mysql - SQL - 如果相同的记录不在表 Y 中,则从表 X 中删除记录

php - 我在通过 PHP 清除 MySQL 表时遇到问题

mysql - 如何设计一个数据库,以便每个条目都可以存储对其他条目的引用?

java - 准备语句的问题

mysql - Asterisk 无法使用 odbc 连接器连接到数据库