如何使这个MySQL查询工作?
我有一张名为“BandspusRating”的表和一张名为“ratings”的表 “bandsplusrating”表中填充了条带,“ratings”表开始为空 两个表都有一个名为“naam”的字段,可以与之联接。 表“ratings”有一个名为“fullname”的字段 每个频带的多个额定值SplusRating将存储在表“Ratings”中 现在我想显示“bandsplusrating”中所有未被给定用户ratings.fullname评分的记录如何使这个MySQL查询工作?,sql,mysql,Sql,Mysql,我有一张名为“BandspusRating”的表和一张名为“ratings”的表 “bandsplusrating”表中填充了条带,“ratings”表开始为空 两个表都有一个名为“naam”的字段,可以与之联接。 表“ratings”有一个名为“fullname”的字段 每个频带的多个额定值SplusRating将存储在表“Ratings”中 现在我想显示“bandsplusrating”中所有未被给定用户ratings.fullname评分的记录 SELECT b.naam, b.stijl
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
诀窍是,左连接在WHERE之前求值。因此,通过首先让联接展开,bandplusrating中与评级中的任何内容都不匹配的任何行都将为评级生成一个空记录一个只有空值的评级记录。然后,您可以使用WHERE筛选,并通过要求评级中某些已知的强制列为NULL,您实际上是在说:只有那些不匹配的列
编辑:
我刚刚看到OMG Ponies的完整回复,并决定添加另一种方法,这只是左连接解决方案的一个微小变化:
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
就我个人而言,我认为这一点不太好,因为前面的答案可能会对您有所帮助,其中有一些额外的解释,将进一步澄清罗兰的答案。使用NOT IN:
使用不存在:
使用左JOIN/IS为空:
表演
。“不存在”也不起作用。谢谢您的快速回复。我现在必须睡觉了,明天会在一个扩展版本中尝试,然后会回来。我跑得很快,看起来很有希望@roland此查询的结果产生重复的字段naam、stijl等。因此,我无法读取$row['naam']。Checkerforth,向我展示一些数据来演示它。所以,从bandplusrating、ratings和结果中选择了一些行,这些行都是重复的。对不同方法的很好的总结。我在我的答案上加了最后一个。重新执行:这可能是因为“不存在”解决方案依赖于一个相关的子查询。@罗兰·鲍曼:这三个解决方案都产生不同的计划,但“存在”方案的效率比其他方案低30%——请参见链接。罗兰解决方案奏效了,但我无法正确阅读结果请参见上面的评论。我现在正在使用你的“Not”解决方案,并在键入时对其进行测试,因为我的查询比我在这里发布的查询更复杂。谢谢你的帮助。这是我在这里的第一个问题,我非常满意!!
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