Mysql
 sql >> Database >  >> RDS >> Mysql

Come trasformare uno schema MySQL entità-attributo-valore

La domanda menziona MySQL, e infatti questo DBMS ha una funzione speciale per questo tipo di problema:GROUP_CONCAT(expr) . Dai un'occhiata al riferimento a MySQL manuale sulle funzioni di raggruppamento . La funzione è stata aggiunta in MySQL versione 4.1. Utilizzerai GROUP BY FileID nella query.

Non sono molto sicuro di come vuoi che appaia il risultato. Se vuoi che ogni attributo sia elencato per ogni articolo (anche se non impostato), sarà più difficile. Tuttavia, questo è il mio suggerimento su come farlo:

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;

Questo ti dà tutti gli attributi nello stesso ordine, il che potrebbe essere utile. L'output sarà simile al seguente:

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

In questo modo è necessaria solo una singola query DB e l'output è facile da analizzare. Se desideri archiviare gli attributi come Datetime reali, ecc.