以下查询是正确的。它返回行paul
和rick
,因为它们具有子行的最高评级。通过以下链接为我解决了这个问题。我无法理解查询。我理解加入,我不明白的是t2.rating is null
?
http://sqlfiddle.com/#!2/97e60/2
select t1.* from mytable t1
left join mytable t2
on t1.parentid = t2.parentid and t1.rating < t2.rating
join mytable parents
on parents.id = t1.parentid
where t2.rating is null AND parents.name like '%mike%'
t1.rating < t2.rating
获得子行的最高评分值,我知道t2.rating is null
表示t2.rating是false但我不知道它在查询中做了什么?我删除了它,并添加了其他结果。那么它究竟是为了消除不正确的结果呢?
答案 0 :(得分:1)
因为您有left join
(而不是join
),即使来自t1
的行没有匹配,您也会从t2
获得行。指定t2.rating is null
只表示您只会获得评分为空的t2
行。
与null
的任何比较都是错误的,即使双方都是null
。 where子句中的t2.rating is null
与join子句中的t1.rating < t2.rating
的组合意味着您永远不会从t2
获取任何行,因为这些条件永远不会同时是true
。
答案 1 :(得分:1)
以下是解释:
1 /当你执行LEFT JOIN时,对于左表(t1)中的每一行,你得到至少一个结果。
2 /如果通过ON子句,t1行不能匹配任何t2行,则会得到一个NULL t2行(与t2相同的列,但填充NULL值)。
3 /所以,WHERE t2.rating IS NULL实际上过滤了表t1,并且只保留那些ON子句永远不能匹配的行
4 /读取ON子句,这些过滤的行是没有其他行具有更高等级的行:如果t1行不是最高等级,则t2中的行将具有更高的等级;这一行与ON子句匹配,t2.rating不会为NULL!
5 /因此,过滤后的行与您要查找的内容完全匹配:最高评级行
我希望这能为你澄清事情!
答案 2 :(得分:0)
您无法将空值与“is null”或“is not null”之外的任何值进行比较。我认为this link最能描述它。