MySQL 加入两个表并将多行合并为一个

Dim*_*ski 2 mysql sql

我有2张桌子:

短信收件人

campaign_id | message | user_id | contact_number | status
.........................................................
1            something  12334     078237812719     1
1            something  12123     071231231232     1
2            other      12124     078123123126     0
2            other      12334     078234234212     0
2            other      42124     078124124415     1
Run Code Online (Sandbox Code Playgroud)

sms_campaign

campaign_id | shop_id| campaign_type
.....................................
1             1123     marketing
2             2123     awareness
3             3231     something else
4             4432     bla bla
5             5244     last
Run Code Online (Sandbox Code Playgroud)

campaign_id的是独特的sms_campaign表,有多种user_id的有关同campaign_idmessage是为所有唯一相同champagne_id

我想将它们组合在一起,以便每个contact_number 相同的campaign_id带有 astatus = 0出现在这样的单行和单列中:

campaign_id | shop_id| campaign_type | users_mobile_numbers      | message
..........................................................................
1             1123     marketing                                  something 
2             2123     awareness       078123123126,078234234212  other      
3             3231     something else
4             4432     078234234212
5             5244     078124124415
Run Code Online (Sandbox Code Playgroud)

到目前为止,这是我的查询:

SELECT c.campaign_id, 
shop_id,
campaign_type, 
contact_number AS users_mobile_numbers, 
message FROM sms_campaign c 
LEFT JOIN sms_recipients r 
ON u.campaign_id = c.campaign_id 
WHERE status = 0
Run Code Online (Sandbox Code Playgroud)

Stu*_*tLC 5

在 中LEFT JOIN,您需要将过滤器移动status = 0到连接条件中,或者如果您将过滤器保留在 WHERE 子句中,那么status = 0 OR status IS NULL为了避免过滤掉根本没有消息的活动 - 我已经完成了第一个选项。

根据评论,您需要GROUP按活动列获取数据,并将聚合函数应用于所有非分组列,以保证每组只有一行 -GROUP_CONCAT将连接每个组中的所有文本值。我随意使用MIN,解决了价值shopmessage,但您可能需要调整,否则。(如果需要,您也可以在 GROUP CONCAT 中执行 DISTINCT)。

SELECT 
  c.campaign_id, 
  MIN(shop_id) AS shop_id,
  campaign_type, 
  GROUP_CONCAT(contact_number) AS users_mobile_numbers, 
  MIN(message) AS message
FROM sms_campaign c 
LEFT JOIN sms_recipients r 
  ON u.campaign_id = c.campaign_id AND status = 0
GROUP BY c.campaign_id, campaign_type;
Run Code Online (Sandbox Code Playgroud)