【问题标题】:MySQL - Join a table twice with a main tableMySQL - 将一个表与一个主表连接两次
【发布时间】:2011-05-05 11:03:22
【问题描述】:

我不确定这是否可以做到。但我只是想和这里的专家核实一下。

我的情况是: 我有一个表 tbl_campaign,它基本上存储了一个活动,该活动与一个名为 tbl_campaign_user 的表具有一对多关系,其中在活动期间选择的用户与活动 ID 一起存储(tbl_campagin_user.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' 

我不确定在合并两者时我做错了什么。我知道我对连接不太了解,所以可能是概念错误?请问谁能帮帮我?

提前谢谢!

【问题讨论】:

    标签: mysql join left-join


    【解决方案1】:

    您只需加入 tbl_campaign_user 一次, 计算(总和,随便)多少次 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
    

    请注意,这是一种伪代码,您可能需要详细说明 select 子句和 group by 子句中的总和/计数。

    【讨论】:

    • 嗨 bpgergo,感谢您的快速回复。我将 group by 更改为 tbl_campaign.campaign_id 并将 ON 条件更正为 user.cu_campaign_id 而不是 unsent.cu ...(我知道这是您的错字,但以防万一有人想在类似的场合使用) .但是,我正在寻找的是对连接的相对见解 - 如果我的表没有 cu_status 以致无法进行 SUM 怎么办?我需要更多帮助:)
    • Append:: 在这种情况下,左连接两个子查询是唯一的选择吗?
    • 如果您的 tbl_campaign_user.cu_status 字段没有可能的值 0 和 1 而是字符标志,那么您的总和将是这样的:sum(if(cu_status='S', 1, 0)) 请参阅 mysql if。在这种情况下,SUM 是您的朋友:您必须找到一个函数,该函数对所需的情况给出 1,对所有其他情况给出零,然后使用 SUM 来计算所需的情况。我希望这会有所帮助。
    • 非常感谢!!但是,我已经编辑了您写入的查询中的拼写错误: ------------------- SELECT c.campaign_id, count( u.cu_id ) AS num_all_campaign_users, sum( u .cu_status ) AS num_sentcampaign_users, count( u.cu_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 c.campaign_id1 ' GROUP BY c.campaign_id
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多