2011-11-27 11 views
10

Estoy trabajando en MYSQL y necesito extraer los datos del usuario para incorporarlos a una vista. Utilizaré los datos en un cliente de correo electrónico, por lo que no puedo hacer esto en la capa de la aplicación.Fusionando múltiples filas en una fila y varias columnas en mysql

El problema es que cada campo de datos para el usuario está contenido en filas separadas (así es como Wordpress configura la estructura de datos).

Por ejemplo, wp_usermeta tiene múltiples filas de datos para cada usuario de esta manera:

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] 

necesito los datos que se combinan en una sola fila, campos separados, como este:

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

He buscado y no puedo encontrar este problema exacto en ninguna parte (encontré mucha concatenación, pero eso no es lo que necesito).

+2

Foro sólo se preocupan por nombre, apellido y correo electrónico? –

Respuesta

12

Si estas son las únicas columnas que ocupa, esto va a funcionar para usted:

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' 
+0

Gracias por la respuesta rápida Adam. Intenté ejecutar la consulta, pero todos los campos de datos se rellenan con el nombre de la columna, no con los datos reales. Así que todos los datos de nombre apellido es 'nombre', etc. SELECT um.user_id, fn.meta_key AS nombre apellido, ln.meta_key AS APELLIDOS, e.meta_key como el correo electrónico DE wp_usermeta AS um LEFT JOIN wp_usermeta COMO EN fn um.user_id = fn.user_id Y fn.meta_key = 'nombre' LEFT JOIN wp_usermeta como ln EN um.user_id = ln.user_id Y ln.meta_key = 'apellido' LEFT JOIN wp_usermeta como e = EN um.user_id e.user_id AND e.meta_key = 'email' – katemerart

+0

@katemerart Su 'SELECT' está usando' meta_key' en lugar de 'meta_data' como mi respuesta lo sugiere. Si copia/pega mi respuesta y la ejecuta, debería obtener los resultados que desea. –

+0

Adam - eso lo hizo - ¡Gracias! Tuve que agregar DISTINCT para evitar obtener múltiples filas de la misma información, pero lo hice funcionar. ¡¡¡Muchas gracias!!! – katemerart

0

La respuesta y los comentarios anteriores dan la solución correcta. Ésta es la consulta de trabajo (en el esquema para WP 3.1) para copiar y pegar ...

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' 
1

aquí es una otra solución que no necesita unirse a operaciones adicionales, en cambio, hacemos uso de group by declaración junto con case declaración.

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; 

Nota max la función es sólo para convertirlos en una fila, puede utilizar min también.

Comprobar SQL Fiddler Demo aquí

Cuestiones relacionadas