簡體   English   中英

MySQL連接兩個表並將多行合並為一個

[英]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_idmessage都是相同的

我想將它們組合在一起,以使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來解析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;

r.status上的條件r.status外部r.statusON子句中。 (由於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM