varias - transponer filas en columnas mysql
Unir una fila a varias filas en otra tabla (3)
Tengo una tabla para entidades (llamémoslas personas) y propiedades (una persona puede tener un número arbitrario de propiedades). Ex:
Gente
Name Age
--------
Jane 27
Joe 36
Jim 16
Propiedades
Name Property
-----------------
Jane Smart
Jane Funny
Jane Good-looking
Joe Smart
Joe Workaholic
Jim Funny
Jim Young
Me gustaría escribir una selección eficiente que seleccionaría personas según la edad y devolvería todas o algunas de sus propiedades.
Ex: People older than 26
Name Properties
Jane Smart, Funny, Good-looking
Joe Smart, Workaholic
También es aceptable devolver una de las propiedades y la cantidad total de propiedades.
La consulta debe ser eficiente: hay millones de filas en la tabla de personas, cientos de miles de filas en la tabla de propiedades (por lo que la mayoría de las personas no tienen propiedades). Hay cientos de filas seleccionadas a la vez.
¿Hay alguna forma de hacerlo?
Puede utilizar INNER JOIN
para vincular las dos tablas. Más información en JOINs .
SELECT *
FROM People P
INNER JOIN Properties Pr
ON Pr.Name = P.Name
WHERE P.Name = ''Joe'' -- or a specific age, etc
Sin embargo, a menudo es mucho más rápido agregar una clave principal única a tablas como éstas y crear un index para aumentar la velocidad.
Decir que la tabla La People
tiene un id
campo
Y la tabla Properties
tiene un campo peopleId
para vincularlos
Entonces la consulta se vería así:
SELECT *
FROM People P
INNER JOIN Properties Pr
ON Pr.id = P.peopleId
WHERE P.Name = ''Joe''
Utilizar:
SELECT x.name,
GROUP_CONCAT(y.property SEPARATOR '', '')
FROM PEOPLE x
LEFT JOIN PROPERTIES y ON y.name = x.name
WHERE x.age > 26
GROUP BY x.name
Desea la función MySQL GROUP_CONCAT ( documentation ) para devolver una lista separada por comas del valor PROPIEDADES.
Usé una UNIÓN IZQUIERDA en lugar de una ÚNETE para incluir los registros de PERSONAS que no tienen un valor en la tabla PROPIEDADES: si solo desea una lista de personas con valores en la tabla PROPIEDADES, use:
SELECT x.name,
GROUP_CONCAT(y.property SEPARATOR '', '')
FROM PEOPLE x
JOIN PROPERTIES y ON y.name = x.name
WHERE x.age > 26
GROUP BY x.name
Me doy cuenta de que este es un ejemplo, pero usar un nombre es una mala elección para la integridad referencial cuando se considera cuántos "John Smith" hay. Asignar un user_id, siendo un valor numérico, sería una mejor opción.
SELECT x.name,(select GROUP_CONCAT(y.Properties SEPARATOR '', '')
FROM PROPERTIES y
WHERE y.name.=x.name ) as Properties FROM mst_People x
prueba esto