使用相同的表格双重加入

时间:2015-11-24 22:01:31

标签: mysql

我对查询有一点问题,我会用同一个表做两次双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

我该如何解决?

1 个答案:

答案 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子句使左连接成为内部连接!