我有2张桌子.一个是可以学习的东西的表.有一个JID可以描述每一行,并且每行都是唯一的.第二个表是已经学习的事物(JID)的日志,也是学习它的人的用户ID.我目前正在使用它来选择JID的所有数据,但只选择用户根据用户ID学习的数据.
SELECT *
FROM tablelist1
LEFT JOIN tablelog2 ON (tablelist1.JID = tablelog2.JID)
AND tablelog2.UID = 'php var'
WHERE tablelog2.JID IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
我现在需要选择要学习的东西行,但只需要用户ID尚未学习的东西.我显然对此很新,请耐心等待.:)我尝试使用IS NULL,但虽然看起来它有效,但它给出了重复的JID,其中一个是NULL,一个是正确的.
OMG*_*ies 22
使用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
Run Code Online (Sandbox Code Playgroud)
使用NOT IN:
SELECT t.*
FROM TABLE_LIST t
WHERE t.jid NOT IN (SELECT tl.jid
FROM TABLE_LOG tl
GROUP BY tl.jid)
Run Code Online (Sandbox Code Playgroud)
使用NOT EXISTS:
SELECT t.*
FROM TABLE_LIST t
WHERE NOT EXISTS(SELECT NULL
FROM TABLE_LOG tl
WHERE tl.jid = t.jid)
Run Code Online (Sandbox Code Playgroud)
FYI
LEFT JOIN/IS NULL和NOT IN在MySQL中是等效的 - 它们将执行相同的操作,而NOT EXISTS则更慢/效率更低.有关详细信息,请访问:http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/