admin

从带条件的表2中不存在的表1中选择*

sql

我有2张桌子。一个是一张桌子,上面有可以学习的东西。有一个JID描述了每种类型的行,并且对于每一行都是唯一的。第二张表是已经学习过的东西的日志(JID)以及学习它的人的用户ID。我目前正在使用它来选择JID的所有数据,但是只能选择用户根据userid学到的那些数据。

SELECT * 
FROM tablelist1
LEFT JOIN tablelog2 ON (tablelist1.JID = tablelog2.JID) 
                       AND tablelog2.UID = 'php var'
WHERE tablelog2.JID IS NOT NULL

现在,我需要选择要学习的东西行,但只选择用户ID尚未学习的东西。我显然对此很陌生,请忍受。:)我尝试使用IS
NULL,但是虽然看起来可以正常工作,但它给出了重复的JID,一个是NULL,一个是正确的。


阅读 137

收藏
2021-05-10

共1个答案

admin

使用LEFT JOIN / IS NULL:

   SELECT t.*
     FROM TABLE_LIST t
LEFT JOIN TABLE_LOG tl ON tl.jid = t.jid
    WHERE tl.jid IS NULL

使用NOT IN:

SELECT t.*
  FROM TABLE_LIST t
 WHERE t.jid NOT IN (SELECT tl.jid
                       FROM TABLE_LOG tl
                   GROUP BY tl.jid)

使用不存在:

SELECT t.*
  FROM TABLE_LIST t
 WHERE NOT EXISTS(SELECT NULL
                    FROM TABLE_LOG tl
                   WHERE tl.jid = t.jid)

FYI
LEFT JOIN / IS NULL和NOT IN在MySQL中是等效的-它们将执行相同的操作,而NOTEXISTS则较慢/效率较低。

2021-05-10