【问题标题】:mysql query WHERE in one table but not the othermysql查询一个表中的WHERE而不是另一个
【发布时间】:2010-09-15 16:56:59
【问题描述】:

编辑:这样做了:

  SELECT DISTINCT profileid 
FROM profilesrelevation 
WHERE profileid NOT IN (
  SELECT profileid FROM profiles
)

我需要获取profilesrelevation 表中存在但profiles 表中不存在的profileid 值

profiles 表有 8107 个不同的“profileid”值,而profilesrelevation 表有 8380 个不同的“profilesid”值...

profiles.profileid
profilerelevation.profileid

select * from profiles, profilesrelevation 
where profilesrelevation.profileid != profiles.profileid  

不行,怎么办?

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    使用 LEFT JOIN / IS NULL

       SELECT pr.*
         FROM PROFILESREVELATION pr
    LEFT JOIN PROFILES ON p.profileid = pr.profileid
        WHERE p.profileid IS NULL
    

    使用不存在

    SELECT pr.*
      FROM PROFILESREVELATION pr
     WHERE NOT EXISTS(SELECT NULL
                        FROM PROFILES p
                       WHERE p.profileid = pr.profileid)
    

    使用 NOT IN

    SELECT pr.*
      FROM PROFILESREVELATION pr
     WHERE pr.profileid NOT IN (SELECT p.profileid
                                  FROM PROFILES p)
    

    结论

    LEFT JOIN IS NULL is the most efficient on MySQL when the columns compared are not nullable。如果the columns compared were nullable, NOT IN and NOT EXISTS are more efficient.

    【讨论】:

    • 很好,简洁的解释。我还要补充一点,当子查询返回更多记录时,NOT IN 开始降低性能。如果配置文件表非常大,不存在可能会更好。
    【解决方案2】:

    你会想要使用一套:

    SELECT DISTINCT profileid 
    FROM profilesrelevation 
    WHERE profileid NOT IN (
      SELECT profileid FROM profiles
    )
    

    这将从table:profilesrelevation 中选择所有行/列,其中行的profileid 不在table:profiles 中:)

    更新:包括 distinct,因为它会显示 profileid 在profilesrelevation 表中不是唯一的。

    【讨论】:

    • 查询一直在加载,什么也没发生,我的电脑很强大,一定有问题。
    • 那是因为您的数据规模太大,并且可能是因为您在任一表中的 profileid 上都没有索引。如果您可以编辑表格,请尝试添加索引。
    • 关于索引的事情,这不是我通常做的事情,我只使用 id 表来关联表,但这只是暂时的,所以我做了不同的事情,忘记添加索引,如果它仍然需要时间,也许我可以做两个查询,存储在数组中,比较数组,然后将所有数据存储在第三个数组中,
    • 添加索引后一切顺利,但我得到了很多结果,让我再试一次
    • 查询现在运行良好,但我得到重复的结果或更多相同的profileid,我该把它们整理出来。
    【解决方案3】:
    SELECT
        profilesrelevation.profileid
    FROM
        profilesrelevation
        LEFT JOIN profiles ON profilesrelevation.profileid = profiles.profileid
    WHERE
        profiles.profileid IS NULL
    

    (您不妨使用SELECT DISTINCT。)

    【讨论】:

      猜你喜欢
      • 2016-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多