2015-09-09 55 views
2

我已经知道我可以使用union在MySQL中进行外连接。 我也检查这一个。 Full Outer Join in MySQL在mysql中执行完全外连接

但我想要做这样的事情,我不知道如何使用union来实现这一点。我有db表user_count如下。

+-------------+-----------+---------+-------+ 
| meb_id  | left_id |right_id |active |  
+-------------+-----------+---------+-------+ 
| 1001  | (NULL) | (NULL) | 1 | 
| 1002  | 1001  | 0  | 0 | 
| 1003  | 0   | 1001 | 0 | 
| 1004  | 1001  | 0  | 0 | 
| 1004  | 1002  | 0  | 0 | 
+-------------+-----------+---------+-------+ 

我有疑问如下。

SELECT left_id, COUNT(left_id) AS left_count FROM `user_count` GROUP BY left_id 

    SELECT right_id, COUNT(right_id) AS right_count FROM `user_count` GROUP BY right_id; 

SELECT left_id AS meb_id, COUNT(left_id) AS active_left_count FROM `user_count` WHERE active = 1 GROUP BY left_id; 

SELECT right_id AS meb_id, COUNT(right_id) AS active_right_count FROM `user_count` WHERE active = 1 GROUP BY right_id; 

我想瓶坯外连接或联合,所以我的结果会是这样

+-------------+-----------+------------+------------+--------------+ 
| meb_id  |left_count |right_count |active_left |active_right | 
+-------------+-----------+------------+------------+--------------+ 
| (NULL)  | 0   | 0   | 0   | 0   | 
| 0   | 1   | 3   | 0   | 0   | 
| 1001  | 2   | 1   | 0   | 0   | 
| 1002  | 1   | 0   | 0   | 0   | 
| 1003  | 0   | 0   | 0   | 0   | 
+-------------+-----------+------------+------------+--------------+ 

我怎样才能做到这一点。任何帮助不胜感激。

+0

你的结果是没有意义的我。为什么1001有2个正确的计数,而不是1?什么是0 meb_id?和null?你需要给一个公式,一些逻辑,不要让我们想你想要什么 – Cosmin

+0

@Cosmin Sry其实它的1.错误我写了2. 我要编辑这个。 希望你现在明白吧。 –

+0

@Cosmin 其实没有公式。我只需要按特定列计算left_id和right_id组。正如你在结果表中所看到的,我希望有和没有活动条件的所有左和右id的数量。 –

回答

1

试试这个:

select 
    a.meb_id 
    ,sum(case when a.meb_id = b.left_id then 1 else 0 end) left_count 
    ,sum(case when a.meb_id = b.right_id then 1 else 0 end) right_count 
    ,sum(case when a.meb_id = b.left_id and active = 1 then 1 else 0 end) active_left 
    ,sum(case when a.meb_id = b.right_id and active = 1 then 1 else 0 end) active_right 
from (
    select meb_id from user_count union 
    select left_id from user_count union 
    select right_id from user_count 
) a 
cross join user_count b 
group by a.meb_id 
order by a.meb_id 

演示 sqlfiddle