2011-05-05 126 views
2

我不确定这是否可以完成。但我只是想和这里的专家核对一下。MySQL - 与主表连接两次表格

我的情况是: 我有基本上存储一个广告活动时,有一个人跟在竞选期间被选中的用户与广告活动编号(tbl_campagin_user一起存储的表称为tbl_campaign_user许多关系的表tbl_campaign。 cu_campaign_id = tbl_campaign.campaign_id)。

第二张表(tbl_campaign_user)的状态字段为0/1表示未发送/发送。我想写一个单独的sql查询来读取活动数据以及发送和未发送活动用户的数量(这就是为什么我要在第二个表上连接两次)。 我在下面尝试了这一点,但我得到了与发送和未发送相同数量的计数。

SELECT `tbl_campaign`.*, 
COUNT(sent.cu_id) as numsent, 
COUNT(unsent.cu_id) as num_unsent FROM (`tbl_campaign`) 

LEFT JOIN tbl_campaign_user as sent on (sent.cu_campaign_id = tbl_campaign.campaign_id and sent.cu_status='1') 

LEFT JOIN tbl_campaign_user as unsent on (unsent.cu_campaign_id = tbl_campaign.campaign_id and unsent.cu_status='0') 


WHERE `tbl_campaign`.`campaign_id` = '19' 

我试着调试通过打破查询分成两个部分: =>

SELECT `tbl_campaign`.*, 

COUNT(unsent.cu_id) as num_unsent FROM (`tbl_campaign`) 

Left join tbl_campaign_user as unsent on (unsent.cu_campaign_id = tbl_campaign.campaign_id and unsent.cu_status='0') 

WHERE `tbl_campaign`.`campaign_id` = '19' 

上述作品正是被通缉。所以做下一个:我不知道我已经做错了,而合并两个

=>

SELECT `tbl_campaign`.*, 
COUNT(sent.cu_id) as numsent FROM (`tbl_campaign`) 

Left join tbl_campaign_user as sent on (sent.cu_campaign_id = tbl_campaign.campaign_id and sent.cu_status='1') 

WHERE `tbl_campaign`.`campaign_id` = '19' 

。我知道我对加入的了解不多,所以可能是一个概念错误?请任何人都可以帮我吗?

Thx提前!

回答

2

您只需要加入tbl_campaign_user一次,并且 count(总和,无论)cu_status是零次/一次多少次。

SELECT `tbl_campaign`.id, 
count(u.id) as num_all_campaign_users 
sum(u.cu_status) as num_sentcampaign_users, 
count(u.id) - sum(u.cu_status) as num_unsent_campaign_users 
FROM `tbl_campaign` c 
LEFT JOIN tbl_campaign_user as u on (u.cu_campaign_id = c.campaign_id) 
WHERE `tbl_campaign`.`campaign_id` = '19' 
group by `tbl_campaign`.id 

注意,这是有点伪代码,你可能要阐述 总和/ BY子句select子句和组数为好。

+0

嗨bpgergo,感谢您的快速回复。 我将组更改为tbl_campaign.campaign_id,并将ON条件更正为user.cu_campaign_id而不是unsent.cu ...(我知道这是您的错字,但为了防止有人想使用类似occassion)。 但是,我所追求的是对连接的相对洞察力 - 如果我的表没有cu_status以致没有SUM成为可能,该怎么办?我想更多的帮助:) – zarun 2011-05-05 11:55:28

+0

追加::将左连接两个子查询是唯一的选择在这种情况下? – zarun 2011-05-05 12:01:30

+0

如果你的tbl_campaign_user.cu_status字段没有可能的值为零和一个字符标志,那么你的总和会是这样的:'sum(if(cu_status ='S',1,0))'See mysql [if ](http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if)。在这种情况下,SUM是你的朋友:你必须找到一个函数,它给出所需的情况为1,所有其他情况为零,然后使用SUM来计算所需的情况。我希望有所帮助。 – bpgergo 2011-05-05 12:02:35