2016-12-16 64 views
0

我試圖從計數有attr3爲1計數總和,其中value = 1

值的多個表中的所有記錄這是我到目前爲止有:

SELECT 'Dept' AS table_name, COUNT(*) 
FROM table1, table2 
WHERE table1.attr3='1' AND table2.attr3='1' 

我遇到的問題是顯示錯誤的號碼。它應該顯示爲7,而不是12

我必須把它寫在這樣一種方式,因爲attr3是一個外鍵,以便一些解決方案可以拿出attr3 is ambiguous

任何人都知道我可能去錯了嗎?謝謝

編輯

那麼我想兩次,但不同的數值適用相同的查詢來獲得單獨計數:

SELECT 'Dept' AS table_name, COUNT(*) 
FROM table1, table2 
WHERE table1.attr3='2' AND table2.attr3='2' 

最大限度地減少代碼將是一大利好!

+0

給我們一個樣本數據和預期的結果 – GurV

回答

0

逗號運算符創建笛卡爾積。這會產生比您想要更多的行(在大多數情況下)。相反,使用union all與你一起的條件:

SELECT 'Dept' AS table_name, COUNT(*) 
FROM ((select attr3 from table1) union all 
     (select attr3 from table2) 
    ) t 
WHERE attr3 = '1'; 
+0

非常感謝。快速問題,'t'的用法是什麼?爲什麼它需要在那裏? –

+0

@ Paji.R。 。 。 MySQL在'FROM'子句中需要一個子查詢的表別名。 –

+0

是的,現在有意義:)如果我想兩次執行這個語句,但是有'WHERE'子句選擇一個不同的值,我將如何使用一個連接使用您的解決方案在相關表中顯示單獨的結果? –

0

您應該使用UNION而不是JOIN來組合這兩個表,因爲您在表之間沒有將行彼此關聯。然後使用GROUP BY獲得每個attr3的計數。

SELECT attr3, COUNT(*) 
FROM (
    SELECT attr3 FROM table1 
    UNION ALL 
    SELECT attr3 FROM table2 
) AS u 
GROUP BY attr3 

分別在每個表中做計數可能會更好,然後求和它們。如果你有一個attr3索引,這將能夠利用它。

SELECT attr3, SUM(count) 
FROM (
    SELECT attr3, COUNT(*) AS count 
    FROM table1 
    GROUP BY attr3 
    UNION ALL 
    SELECT attr3, COUNT(*) 
    FROM table2 
    GROUP BY attr3 
) AS u 
GROUP BY attr3 

請確保您使用UNION ALL,不只是UNION,因爲默認情況下它會刪除重複。

+0

這個解決方案給了我下面的結果。 http://puu.sh/sR5k4/2758a6d06a.png –

+0

它應該顯示爲「3」,然後是「4」,我想只有兩個條目? –

+0

如果您只想要3和4的計數,請將WHERE attr3 IN(3,4)'添加到查詢中。 – Barmar