Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment faire pivoter un schéma entité-attribut-valeur MySQL

La question mentionne MySQL, et en fait ce SGBD a une fonction spéciale pour ce genre de problème :GROUP_CONCAT(expr) . Consultez la référence MySQL manuel sur les fonctions groupées . La fonction a été ajoutée dans MySQL version 4.1. Vous utiliserez GROUP BY FileID dans la requête.

Je ne sais pas vraiment à quoi vous voulez que le résultat ressemble. Si vous voulez que chaque attribut soit répertorié pour chaque élément (même s'il n'est pas défini), ce sera plus difficile. Cependant, voici ma suggestion sur la façon de le faire :

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;

Cela vous donne tous les attributs dans le même ordre, ce qui peut être utile. Le résultat ressemblera à ce qui suit :

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

De cette façon, vous n'avez besoin que d'une seule requête DB et la sortie est facile à analyser. Si vous souhaitez stocker les attributs en tant que Datetime réelle, etc. dans la base de données, vous devez utiliser SQL dynamique, mais je resterais à l'écart de cela et stockerais les valeurs dans des varchars.