我在查询时遇到了一个小问题,我需要对同一个表进行两次双重联接。我有这两张表:
list_couples
|id |p_1 |p_2|
|1 |Topolino |Minnie|
|2 |Pippo |Pluto|
|3 |Paperino |Paperone|
rank
|year |week |player |points
|2015 |1 |Paperino |200
|2015 |1 |Pippo |100
|2015 |1 |Paperone |50
|2015 |1 |Topolino |30
|2015 |1 |Minnie |30
|2015 |2 |Paperino |300
|2015 |2 |Pippo |150
|2015 |2 |Paperone |50
|2015 |2 |Pluto |40
我会通过减少一年中一周两个玩家的总积分来对表 list_pairs 中的情侣(p_1 和 p_2)进行排序。
当一对玩家都在排名表中时,我的查询有效,但如果一个或两个不在排名表中,则不会作为第一周的示例,其中冥王星不在第一周的排名表中。
这是我的查询:
SELECT i.*, r.*, r2.*,
r.points + r2.points AS sum_points
FROM list_couples AS l
LEFT JOIN rank AS r ON l.p_1=r.player
LEFT JOIN rank AS r2 ON l.p_2=r2.player
WHERE r.week='$week' AND r.year='$year' AND
r2.week='$week' AND r2.year='$year'
ORDER BY sum_points DESC
通过这个解决方案,我得到了这个结果
结果
|3 |Paperino |Paperone |2015 |1 |300 |2015 |1 |50 |350
|1 |Topolino |Minnie |2015 |1 |30 |2015 |1 |30 |60
而不是这个
|3 |Paperino |Paperone |2015 |1 |300 |2015 |1 |50 |350
|2 |Pippo |Pluto |2015 |1 |100 |2015 |1 |NULL |100
|1 |Topolino |Minnie |2015 |1 |30 |2015 |1 |30 |60
我该如何解决?
由于空记录,左连接表上的 where 子句限制正在消除所需的结果...因此,将限制移至连接本身,以便在连接之前应用限制,从而保留空值记录。
SELECT i.*,r.*,r2.*, r.points+r2.points AS sum_points
FROM list_couples AS l
LEFT JOIN rank AS r ON l.p_1=r.player
and r.week='$week' AND r.anno='$anno'
LEFT JOIN rank AS r2 ON l.p_2=r2.player
and r2.week='$week' AND r2.anno='$year'
ORDER BY sum_points DESC
因为 pluto 没有周/年 (anno),所以 where 子句会消除该记录。通过将限制移动到连接,过滤器将在连接发生之前应用,从而保留 LEFT 外部连接。
换句话说,WHERE 子句使左连接成为内部连接!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)