我有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_id的message是为所有唯一相同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)
在 中LEFT JOIN,您需要将过滤器移动status = 0到连接条件中,或者如果您将过滤器保留在 WHERE 子句中,那么status = 0 OR status IS NULL为了避免过滤掉根本没有消息的活动 - 我已经完成了第一个选项。
根据评论,您需要GROUP按活动列获取数据,并将聚合函数应用于所有非分组列,以保证每组只有一行 -GROUP_CONCAT将连接每个组中的所有文本值。我随意使用MIN,解决了价值shop和message,但您可能需要调整,否则。(如果需要,您也可以在 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)