我有一个名为“bandsplusrating”的表和一个名为“ratings”的表 “bandsplusrating”表中填满了频段,“ratings”表开始时为空。
两个表都有名为“naam”的字段,可以将它们连接起来。 表“ratings”有一个名为“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'
当其他用户对其进行评分时,此查询仍会显示一条记录。
我已经挣扎了好几天了,有人可以帮助我吗?
谢谢!
最佳答案
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
诀窍是,LEFT JOIN 在 WHERE 之前求值。因此,通过首先让连接展开,来自 bandplusrating 的任何与 ratings 中的任何内容都不匹配的行都将产生一个 NULL 评级记录(一个只有 NULL 值的评级记录)。然后,您可以使用 WHERE
进行过滤,并要求评级中的某些已知强制列 IS NULL
,您实际上是在说:只有那些不匹配的.
编辑:
我刚刚看到 OMG Ponies 的彻底回复,并决定添加另一种方法来完成它,这只是 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
(个人觉得这个不如上一个好)
关于sql - 我怎样才能使这个 MySQL 查询工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2106047/