[英]MySQL Join two tables and combine multiple rows into one
我有2張桌子:
sms_recipients
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
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
對於sms_campaign
表, campaign_id
是唯一的,與同一個campaign_id
相關的有多個user_id
,對於所有唯一的champagne_id
, message
都是相同的
我想將它們組合在一起,以使status = 0
的同一campaign_id
每個contact_number
都顯示在單個行和列中,如下所示:
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
到目前為止,這是我的查詢:
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
在LEFT JOIN
,您將需要將過濾器status = 0
移到LEFT JOIN
條件中,或者如果將過濾器留在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;
將r.status
上的條件r.status
外部r.status
的ON
子句中。 (由於WHERE子句中的條件要求r.status
為非NULL,這將否定LEFT JOIN的外部性,使其等效於INNER JOIN。)
添加GROUP BY
子句以折疊行。
使用GROUP_CONCAT
函數合並contact_number
的值。 出現在SELECT列表中但未包含在GROUP BY子句中的列引用也應包含在聚合表達式中。)
SELECT c.campaign_id
, ...
, GROUP_CONCAT(DISTINCT r.contact_number ORDER BY r.contact_number) AS `c_numbers`
, MIN(r.message) AS `message`
FROM campaign c
LEFT
JOIN sms_recipients r
ON r.campaign_id = c.campaign_id
AND r.status = 0
GROUP BY c.campaign_id
GROUP_CONCAT
聚合函數返回的值受max_group_concat_len
變量限制。 較長的值將被無提示地截斷為最大長度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.