MySQL自我加入与排除在哪里

时间:2012-08-01 20:56:38

标签: mysql outer-join

我正在寻找this question对面的解决方案。 我想将tableA自行连接为tableB,因此where子句不会影响tableB结果。 我想用cancel_date ='0000-00-00'获得所有客户和客户总数的总和 我不想切换表tableA和tableB的位置。我有基于tableA的其他whereselect语句。

SELECT 
count(tableA.client_id) as c_total, 
count(tableB.client_id) as all_c_total 
FROM (tableA) LEFT JOIN tableA tableB ON tableA.client_id = tableB.client_id
WHERE tableA.`cancel_date` = '0000-00-00' 
GROUP BY month(tableA.purch_date) 
ORDER BY month(tableA.purch_date)       

结果应如下所示:

---------------------
c_total | all_c_total
---------------------
  251   | 273
  45    | 65
  12    | 15
  23    | 29    

1 个答案:

答案 0 :(得分:0)

您可以使用RIGHT JOIN,并将条件移出WHERE子句进入连接条件...

SELECT 
    count(t1.client_id) as c_total, 
    count(t2.client_id) as all_c_total 
FROM tableA t1 
    RIGHT JOIN tableA t2 
        ON t1.client_id = t2.client_id
        AND t1.`cancel_date` = '0000-00-00' 
GROUP BY month(t1.purch_date) 
ORDER BY month(t1.purch_date)

但是......我建议您重新考虑,切换表格的顺序,然后使用LEFT JOIN。与LEFT JOIN相比,RIGHT JOIN被认为风格更好,更具可读性。