w3schools varias unir una transponer sola multiples funcion filas convertir columnas agregado sql mysql database join group-concat

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