我对查询有一点问题,我会用同一个表做两次双JOIN。我有这两张桌子:
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_couples中订购情侣(p_1和p_2),在一年内减少两名玩家的总分数。
当夫妻的玩家都在等级表中时,我的查询有效,但如果其中一个或两个都不在等级表中,则不会作为第1周的例子,其中冥王星不在等级表中1。
我的查询:
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
我该如何解决?
答案 0 :(得分:1)
由于空记录,左连接表的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子句使左连接成为内部连接!