簡體   English   中英

如何在mysql中將多行合並為一行

[英]How do I combine multiple rows into one row in mysql

我有一個連接4個表的查詢。 這些表是用戶,用戶信息,電子郵件和電話。 用戶可以擁有一個或多個電話和電子郵件。

這是SQL查詢:

SELECT ur.login_id as loginId, ue.user_email_address as email, up.phone_number as phone
      FROM greydeltadb.gd_user ur 
      LEFT JOIN greydeltadb.gd_user_info uri ON uri.user_id=ur.user_id  
      INNER JOIN greydeltadb.gd_user_emails ue ON ur.user_id = ue.user_id  
      INNER JOIN greydeltadb.gd_phone up  ON ur.user_id = up.user_id  
      ORDER BY ur.login_id

當我執行此查詢時,對於有2封電子郵件和2部電話的用戶,我得到的結果如下:

loginId                  email                        phone
abc                      abc@gmail.com                123456
abc                      abc@gmail.com                798446
abc                      def@gmail.com                123456
abc                      def@gmail.com                798446

然后,我了解了GROUP_CONCAT(),更新后的查詢是:

SELECT ur.login_id, GROUP_CONCAT(ue.user_email_address) as emails,
      GROUP_CONCAT(up.phone_number) as phones
      FROM greydeltadb.gd_user ur 
      LEFT JOIN greydeltadb.gd_user_info uri ON uri.user_id=ur.user_id  
      INNER JOIN greydeltadb.gd_user_emails ue ON ur.user_id = ue.user_id  
      INNER JOIN greydeltadb.gd_phone up  ON ur.user_id = up.user_id  
      GROUP BY ur.login_id  

該查詢返回結果:

loginId                  email                                                                    phone
abc                      abc@gmail.com, def@gmail.com,abc@gmail.com, def@gmail.com                123456, 798446,123456, 798446

但我希望輸出為:

loginId                  email                                        phone
abc                      abc@gmail.com, def@gmail.com                123456, 798446

請幫忙。

只需使用DISTINCT子句,請參閱GROUP_CONCAT的文檔:

> GROUP_CONCAT([DISTINCT] expr [,expr ...]
>              [ORDER BY {unsigned_integer | col_name | expr}
>                  [ASC | DESC] [,col_name ...]]
>              [SEPARATOR str_val])

在MySQL中,您可以獲取表達式組合的串聯值。 若要消除重復的值,請使用DISTINCT子句。 要對結果中的值排序,請使用ORDER BY子句.................


如有查詢,請僅使用:

SELECT ur.login_id, 
      GROUP_CONCAT( DISTINCT ue.user_email_address ) as emails,
      GROUP_CONCAT( DISTINCT up.phone_number ) as phones
      .....

您只需要一個distinct

    SELECT ur.login_id, 
    GROUP_CONCAT(distinct ue.user_email_address) as 
    emails,
    GROUP_CONCAT(distinct up.phone_number) as 
     phones
     FROM greydeltadb.gd_user ur 
     LEFT JOIN greydeltadb.gd_user_info uri ON 
     uri.user_id=ur.user_id  
  INNER JOIN greydeltadb.gd_user_emails ue ON 
     ur.user_id = ue.user_id  
  INNER JOIN greydeltadb.gd_phone up  ON ur.user_id = 
  up.user_id  
  GROUP BY ur.login_id

首先,您沒有使用uri ,因此查詢中不需要它。

其次,您的left join基本上什么也不做。 我懷疑您想要用戶,甚至那些沒有電話或沒有電子郵件的用戶。 如果是這樣的話:

SELECT ur.login_id,
       GROUP_CONCAT(DISTINCT ue.user_email_address) as emails,
       GROUP_CONCAT(DISTINCT up.phone_number) as phones
FROM greydeltadb.gd_user ur LEFT JOIN
     greydeltadb.gd_user_emails ue
     ON ur.user_id = ue.user_id LEFT JOIN
     greydeltadb.gd_phone up
     ON ur.user_id = up.user_id  
GROUP BY ur.login_id  ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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