Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie man ein MySQL-Entity-Attribut-Value-Schema pivotiert

Die Frage erwähnt MySQL, und tatsächlich hat dieses DBMS eine spezielle Funktion für diese Art von Problem:GROUP_CONCAT(expr) . Sehen Sie sich die MySQL-Referenz an Handbuch zu Gruppieren-nach-Funktionen . Die Funktion wurde in MySQL-Version 4.1 hinzugefügt. Sie verwenden GROUP BY FileID in der Abfrage.

Ich bin mir nicht sicher, wie das Ergebnis aussehen soll. Wenn Sie möchten, dass jedes Attribut für jedes Element aufgelistet ist (auch wenn es nicht gesetzt ist), wird es schwieriger. Dies ist jedoch mein Vorschlag, wie es zu tun ist:

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;

Dadurch erhalten Sie alle Attribute in derselben Reihenfolge, was nützlich sein könnte. Die Ausgabe sieht wie folgt aus:

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

Auf diese Weise benötigen Sie nur eine einzige DB-Abfrage, und die Ausgabe ist einfach zu analysieren. Wenn Sie die Attribute als echte Datetime usw. in der DB speichern möchten, müssen Sie dynamisches SQL verwenden, aber ich würde mich davon fernhalten und die Werte in varchars speichern.