Объединение нескольких строк в одну строку и несколько столбцов в 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'