我有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,一个是正确的。
使用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则较慢/效率较低。