2014-01-28 102 views
1

我有2個表..UNION ALL,GROUP BY然後拿到總COUNT

用戶1

user_id  mobile_no 
    1   1111 
    2   2222 

用戶2

user_id  mobile_no 
    1   3333 
    2   2222 

我想先UNION這些表,然後分組,然後要計算總記錄

我使用這個查詢,但它不工作

SELECT COUNT(Q2.total) AS Overall 
FROM (
    SELECT COUNT(Q.user_id) AS total 
    FROM (
    SELECT * FROM user1 
    UNION ALL 
    SELECT * FROM user2 
    ) Q 
    GROUP BY Q.mobile_no 
) Q2 

,如果我的用戶內部查詢例如:

SELECT COUNT(Q.user_id) AS total 
    FROM (
    SELECT * FROM user1 
    UNION ALL 
    SELECT * FROM user2 
    ) Q 
    GROUP BY Q.mobile_no 

我獲得這樣的結果,其實我想重新計數這些結果...

total 
2 
1 
1 

我想到這個結果

Overall 
    3 
+1

什麼是應該顯示的結果?你在'mobile_no'中尋找不同數量的值嗎? –

+0

我已編輯我的問題,現在可以請您爲我找到任何解決方案..? –

回答

3

這很奇怪。似乎沒有人意識到它的那樣簡單:

select count(*) overall 
from (select mobile_no from user1 union select mobile_no from user2) 

unionunion all之間的區別是,union刪除重複。

0
select count (distinct mobile_no) from 
(select user_id, mobile_no from user1 u1 
UNION ALL 
select user_id, mobile_no from user2 u2 
) X 
group by X.mobile_no 
0

而是使用UNION and not UNION ALL

SQL UNION Operator

UNION運算符默認僅選擇不同的值。要允許 重複值,請在ALLION中使用ALL關鍵字。

SELECT COUNT(mobile_no) Overall 
FROM (
      SELECT 
        mobile_no 
      FROM User1 
      UNION 
      SELECT 
        mobile_no 
      FROM User2 
     ) Q 

編輯:

由於@Bohemian正確地指出,沒有必要在不同的。

+2

不需要獨立與聯合:聯合只會整體返回不同的值。如果你刪除了這兩個不同的關鍵字,則不會有任何改變 – Bohemian

+0

@Bohemian,但是如果在同一張表中有重複項呢? –

+1

聯合(不是union all)只返回聯合中不同的值,所以它沒有關係。 – Bohemian

0

假設你正在尋找手機號碼的不同號碼:

select count(distinct mobile_no) as Overall 
from (
    select user_id, mobile_no 
    from user1 
    union all 
    select user_id, mobile_no 
    from user2 
) a 
0

試試這個:

SELECT COUNT(*) FROM 
    ((SELECT * FROM user1) UNION 
     (SELECT user_id as u1,mobile_no as m1 
     FROM user2)) as a1 GROUP BY a1 .1