我有一张名为'bandsplusrating'的表和一张名为'rating'的表 表'bandsplusrating'充满了乐队,表'评级'开始为空。
两个表都有一个名为'naam'的字段,可以将它们连接起来。 表'评级'有一个名为'fullname'的字段
每个频段的多个评级(bandsplusrating)将存储在表'评级'中
现在我要显示来自'bandsplusrating'的所有记录,这些记录没有被给定用户评级(ratings.fullname)
SELECT b.naam, b.stijl
FROM bandsplusrating b
LEFT JOIN ratings r ON b.naam = r.naam
WHERE r.fullname NOT LIKE 'Obama'
当其他用户对其进行评分时,此查询仍会显示记录。
我现在已经好几天了,有人可以帮助我吗?
谢谢!
答案 0 :(得分:5)
SELECT b.naam, b.stijl
FROM bandsplusrating b
LEFT JOIN ratings r
ON b.naam = r.naam
AND 'Obama' = r.fullname
WHERE r.naam IS NULL
诀窍是,在WHERE之前评估LEFT JOIN。因此,首先让联接推出,任何来自bandplusrating的行与评级中的任何内容都不匹配将产生评级的空白记录(仅具有NULL值的评级记录)。然后,您可以使用WHERE
对其进行过滤,并要求评级IS NULL
中的某些已知必填列,您实际上是在说:只有那些不匹配的列。
编辑:
我刚看到OMG小马的全面答复,并决定添加另一种方法,这只是LEFT JOIN
解决方案的一个小变化:
SELECT b.naam, b.stijl
FROM bandsplusrating b
LEFT JOIN ratings r
ON b.naam = r.naam
AND 'Obama' = r.fullname
GROUP BY b.naam, b.stijl
HAVING COUNT(r.naam) = 0
(就我个人而言,我觉得这个不如前一个好)
答案 1 :(得分:4)
SELECT b.naam,
b.stigl
FROM BANDPLUSRATING b
WHERE b.naam NOT IN (SELECT r.naam
FROM RATINGS r
WHERE r.fullname LIKE 'Obama')
SELECT b.naam,
b.stigl
FROM BANDPLUSRATING b
WHERE NOT EXISTS(SELECT NULL
FROM RATINGS r
WHERE r.naam = b.naam
AND r.fullname LIKE 'Obama')
SELECT b.naam,
b.stigl
FROM BANDPLUSRATING b
LEFT JOIN RATINGS r ON r.naam = b.naam
AND r.fullname LIKE 'Obama'
WHERE r.naam IS NULL
Of the three options, the NOT IN
and LEFT JOIN/IS NULL
perform equally。 NOT EXISTS
表现不佳。
答案 2 :(得分:0)
my question here的答案可能对你有所帮助(有一些额外的解释可以进一步澄清罗兰的答案)。