我有2张桌子一个是可以学习的东西的表.有一个JID指定每一行,并且对每一行都是唯一的.第二个表是已经学习的东西(JID)的日志,也是学习它的人的用户标识.我目前正在使用它来选择JID的所有数据,但只有用户基于userid所学习的数据.
SELECT * FROM tablelist1 LEFT JOIN tablelog2 ON (tablelist1.JID = tablelog2.JID) AND tablelog2.UID = 'PHP var' WHERE tablelog2.JID IS NOT NULL
我现在需要选择要学习的行的行,但只有用户标识没有学到的东西.我显然很新,忍受我. :)我尝试使用IS NULL,但似乎它的工作原理,它给了重复的JID的一个是NULL,一个是正确的.
解决方法
使用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)
使用NOT EXISTS:
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中是等效的 – 它们将执行相同的操作,而NOT EXISTS的速度较慢/效率较低.更多细节:http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/