sql >> Base de Datos >  >> RDS >> Mysql

Cómo pivotar un esquema de entidad-atributo-valor de MySQL

La pregunta menciona MySQL, y de hecho este DBMS tiene una función especial para este tipo de problema:GROUP_CONCAT(expr) . Eche un vistazo a la referencia de MySQL manual de grupo por funciones . La función se agregó en MySQL versión 4.1. Usarás GROUP BY FileID en la consulta.

No estoy muy seguro de cómo quieres que se vea el resultado. Si desea que se enumeren todos los atributos para cada elemento (incluso si no está configurado), será más difícil. Sin embargo, esta es mi sugerencia de cómo hacerlo:

SELECT bt.FileID, Title, Author, 
 GROUP_CONCAT(
  CONCAT_WS(':', at.AttributeName, at.AttributeType, avt.AttributeValue) 
  ORDER BY at.AttributeName SEPARATOR ', ') 
FROM BaseTable bt JOIN AttributeValueTable avt ON avt.FileID=bt.FileID 
 JOIN AttributeTable at ON avt.AttributeId=at.AttributeId 
GROUP BY bt.FileID;

Esto le brinda todos los atributos en el mismo orden, lo que podría ser útil. La salida será como la siguiente:

'F001', 'Dox', 'vinay', 'CustomAttr1:varchar(40):Akash, CustomUseDate:Datetime:2009/03/02'

De esta forma, solo necesita una única consulta de base de datos y el resultado es fácil de analizar. Si desea almacenar los atributos como Datetime real, etc. en la base de datos, necesitaría usar SQL dinámico, pero me mantendría alejado de eso y almacenaría los valores en varchars.