Mysql 在下面的示例中如何使用外部联接?
我正在创建两个查询:Mysql 在下面的示例中如何使用外部联接?,mysql,sql,postgresql,Mysql,Sql,Postgresql,我正在创建两个查询: cid1 pname1 uname1 11 07/2011 admin 5 08/2011 admin 9 09/2011
cid1 pname1 uname1
11 07/2011 admin
5 08/2011 admin
9 09/2011 admin
一,
cid1 pname1 uname1
11 07/2011 admin
5 08/2011 admin
9 09/2011 admin
二,
cid1 pname1 uname1
11 07/2011 admin
5 08/2011 admin
9 09/2011 admin
对于以上两个查询,我得到以下结果
cid1 pname1 uname1
11 07/2011 admin
5 08/2011 admin
9 09/2011 admin
第一季度的结果:
cid1 pname1 uname1
11 07/2011 admin
5 08/2011 admin
9 09/2011 admin
第二季度的结果:
cid1 pname1 uname1
11 07/2011 admin
5 08/2011 admin
9 09/2011 admin
cid2 pname2 uname2
9 07/2011 admin
3 09/2011 admin
结合两个查询后,我得到以下输出:
cid1 pname1 uname1
11 07/2011 admin
5 08/2011 admin
9 09/2011 admin
cid1 cid2 pname1 pname2 uname1 uname2
11 9 07/2011 07/2011 admin admin
9 3 09/2011 09/2011 admin admin
但我想知道结果
cid1 pname1 uname1
11 07/2011 admin
5 08/2011 admin
9 09/2011 admin
cid1 cid2 pname1 pname2 uname1 uname2
11 9 07/2011 07/2011 admin admin
5 0 08/2011 08/2011 admin admin
9 3 09/2011 09/2011 admin admin
怎样才能做到呢
cid1 pname1 uname1
11 07/2011 admin
5 08/2011 admin
9 09/2011 admin
我的综合查询如下:
cid1 pname1 uname1
11 07/2011 admin
5 08/2011 admin
9 09/2011 admin
select a.cid1, b.cid2, a.pname1, b.pname2, a.uname1, b.uname2
from (select count(c.id) as cid1, p.name as pname1, u.name1 as uname
from crm_lead c, account_period p, res_users u
where c.create_date between p.date_start and p.date_stop and
(c.user_id = u.id or c.sales_vertical=u.id) and
u.id = 1
group by p.name, u.name) as a,
(select count(c.id) as cid2, p.name as pname2, u.name as uname2
from crm_lead c, account_period p, res_users u
where c.create_date between p.date_start and p.date_stop and
(c.user_id = u.id or c.sales_vertical=u.id) and
stage_id =12 and
u.id = 1
group by p.name, u.name)as b
where a.pname1 = b.pname2
尝试使用左连接:
cid1 pname1 uname1
11 07/2011 admin
5 08/2011 admin
9 09/2011 admin
select a.cid1, b.cid2, a.pname1, b.pname2, a.uname1, b.uname2 from
(select count(c.id) as cid1, p.name as pname1, u.name1 as uname from crm_lead c, account_period p, res_users u where c.create_date between p.date_start and p.date_stop and (c.user_id = u.id or c.sales_vertical=u.id) and u.id = 108 group by p.name, u.name) as a
left join
(select count(c.id) as cid2, p.name as pname2, u.name as uname2 from crm_lead c, account_period p, res_users u where c.create_date between p.date_start and p.date_stop and(c.user_id = u.id or c.sales_vertical=u.id) and stage_id =12 and u.id = 108 group by p.name, u.name) as b on a.pname1 = b.pname2
要获得请求的结果,查询可能如下所示:
cid1 pname1 uname1
11 07/2011 admin
5 08/2011 admin
9 09/2011 admin
SELECT a.cid1
,COALESCE(b.cid2, 0) AS cid2
,a.pname1
,COALESCE(b.pname2, a.pname2) AS pname2
,a.uname1
,COALESCE(b.uname2, a.uname2) AS uname2
FROM (<query1>) a
LEFT JOIN (<query2>) b ON a.pname1 = b.pname2
选择a.cid1
,聚结(b.cid2,0)为cid2
,a.pname1
,合并(b.pname2,a.pname2)为pname2
,a.uname1
,合并(b.uname2,a.uname2)为uname2
从()开始
a.pname1=b.pname2上的左连接()b
但是,我怀疑您是否真的想要得到确切的结果。使用ANSI-92显式连接语法,而不是旧的隐式连接语法:
cid1 pname1 uname1
11 07/2011 admin
5 08/2011 admin
9 09/2011 admin
select a.cid1,
coalesce(b.cid2,0) cid2,
a.pname1,
coalesce(b.pname2, a.pname1) pname2,
a.uname1,
coalesce(b.uname2, a.uname1) uname2
from (select count(c.id) as cid1, p.name as pname1, u.name1 as uname
from crm_lead c
join account_period p on (c.create_date between p.date_start and p.date_stop)
join res_users u on (c.user_id = u.id or c.sales_vertical=u.id) and u.id=108
group by p.name, u.name) as a
left join
(select count(c.id) as cid2, p.name as pname2, u.name as uname2
from crm_lead c
join account_period p on c.create_date between p.date_start and p.date_stop
join res_users u
on (c.user_id = u.id or c.sales_vertical=u.id) and stage_id=12 and u.id=108
group by p.name, u.name) as b
on a.pname1 = b.pname2
1.在第二个查询中出现错误:
其中a.pname=b.pname
必须是并且a.pname=b.pname
2。请用代码标记将问题格式化。这是不可读的。3.请提供您的表结构。那么,如何使用外部联接进行2个或更多子查询?