2012-08-01 31 views
1

我正在尋找解決方案對面this question。 我想將tableA自聯接爲tableB,所以where子句不會影響tableB的結果。 我想通過cancel_date ='0000-00-00'獲得所有客戶和客戶總數的總和 我不想切換表tableA和tableB的位置。我確實有其他whereselect陳述基於tableA。MySQL自行加入排除其中

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  

回答

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 JOINLEFT JOIN被認爲是比RIGHT JOIN更好的風格和可讀性。

+0

我所有的select和where語句都是基於tableA的,所以我認爲只是因爲tableB中的一個額外列(all_c_total),會導致不恰當的切換表。並且你的答案不起作用(cancel_date仍然影響兩個表) – castt 2012-08-01 21:10:35

+0

@castt嗯......我已經更新了我的答案以替代兩個表......'cancel_date'不應該限制't2'的結果,所以如果更新的查詢不會給你預期的結果,還有一些其他問題,在這種情況下,我建議張貼樣本數據以符合你提供的預期結果。 – 2012-08-01 21:16:26

+0

@castt在'tableA t1'的where子句中不應該有任何條件......這會將你的'outer join'變成'inner join'。至於在你的'from'子句中你的表的排序,我認爲這不應該由你的'select'語句中哪個表具有最多的列來決定......相反,我認爲排序應該基於某些(邏輯進程),從所需的記錄('t2')開始,進行到可選記錄('t1')。 – 2012-08-01 21:19:10