Как мне объединить несколько строк в одну строку в MySQL - PullRequest
0 голосов
/ 25 декабря 2018

У меня был запрос, который объединяет 4 таблицы.Таблицы пользователя, user_info, адрес электронной почты и телефон.У пользователя может быть один или несколько телефонов и электронных писем.

Вот запрос 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

Пожалуйста, помогите.

Ответы [ 3 ]

0 голосов
/ 25 декабря 2018

Вам просто нужно 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
0 голосов
/ 25 декабря 2018

Во-первых, вы не используете 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  ;
0 голосов
/ 25 декабря 2018

Просто используйте предложение 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
      .....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...