Объединение нескольких строк в одну строку и несколько столбцов в mysql

Я работаю в MYSQL и должен извлекать данные пользователя, которые нужно вставить в представление. Я буду использовать данные в почтовом клиенте, поэтому я не могу сделать это на уровне приложения.

Проблема заключается в том, что каждое поле данных для пользователя содержится в отдельных строках (так Wordpress устанавливает структуру данных).

Например, wp_usermeta имеет несколько строк данных для каждого пользователя, например:

user_id   meta_key       meta_data
   2      first_name     Jane
   2      last_name      Austin
   2      email          [email protected]
   3      first_name     Jack
   3      last_name      Palmer
   3      email          [email protected]

Мне нужны данные, которые нужно объединить в одну строку, отдельные поля, например:

user_id  first_name  last_name  email
2        Jane        Austin     [email protected]
3        Paul        Parker     [email protected]

Я искал вокруг и не могу найти эту точную проблему в любом месте (я нашел много конкатенации, но это не то, что мне нужно).

Ответ 1

Если это единственные столбцы, которые вас интересуют, это будет работать для вас:

SELECT um.user_id
   , fn.meta_data AS first_name
   , ln.meta_data AS last_name
   , e.meta_data AS email
FROM wp_userMeta AS um
LEFT JOIN wp_user_Meta AS fn ON um.user_id = fn.user_id
   AND fn.meta_key = 'first_name'
LEFT JOIN wp_user_Meta AS ln ON um.user_id = ln.user_id
   AND ln.meta_key = 'last_name'
LEFT JOIN wp_user_Meta AS e ON um.user_id = e.user_id
   AND e.meta_key = 'email'

Ответ 2

Вот еще одно решение, которое не требует дополнительных операций объединения, вместо этого мы используем оператор group by вместе с инструкцией case.

select um.user_id,
       max(case when um.meta_key ='first_name' then um.meta_data end) AS first_name,  
       max(case when um.meta_key ='last_name' then um.meta_data end) AS last_name  ,
       max(case when um.meta_key ='email' then um.meta_data end) AS email
from wp_usermeta um 
group by user_id;

Обратите внимание, что функция max предназначена только для их включения в одну строку, вы также можете использовать min.

Отметьте Демо-версия SQL Fiddler здесь

Ответ 3

Предыдущий ответ и комментарии дают правильное решение. Вот рабочий запрос (в схеме WP 3.1) для копирования и вставки...

SELECT distinct u.id, u.user_email,
   fn.meta_value AS first_name,
   ln.meta_value AS last_name
FROM wp_users AS u
LEFT JOIN wp_usermeta AS fn ON u.id = fn.user_id
   AND fn.meta_key = 'first_name'
LEFT JOIN wp_usermeta AS ln ON u.id = ln.user_id
   AND ln.meta_key = 'last_name'