Объединение нескольких строк в одну строку и несколько столбцов на MySQL - PullRequest
12 голосов
/ 27 ноября 2011

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

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

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

user_id   meta_key       meta_data
   2      first_name     Jane
   2      last_name      Austin
   2      email          jane@me.com
   3      first_name     Jack
   3      last_name      Palmer
   3      email          jack@me.com

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

user_id  first_name  last_name  email
2        Jane        Austin     jane@email.com
3        Paul        Parker     jack@email.com

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

Ответы [ 3 ]

13 голосов
/ 27 ноября 2011

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

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'
3 голосов
/ 03 июня 2015

Вот еще одно решение, которое не требует дополнительных операций соединения, вместо этого мы используем оператор 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.

Проверьте Демонстрация Fiddler SQL здесь

0 голосов
/ 14 марта 2012

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