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.