De vraag vermeldt MySQL, en in feite heeft dit DBMS een speciale functie voor dit soort problemen:GROUP_CONCAT(expr)
. Kijk eens in de MySQL-referentie handleiding over group-by-functions
. De functie is toegevoegd in MySQL versie 4.1. Je gebruikt GROUP BY FileID
in de zoekopdracht.
Ik weet niet precies hoe je wilt dat het resultaat eruitziet. Als u elk kenmerk voor elk item wilt vermelden (zelfs als dit niet is ingesteld), wordt het moeilijker. Dit is echter mijn suggestie om het te doen:
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;
Dit geeft je alle attributen in dezelfde volgorde, wat handig kan zijn. De uitvoer zal als volgt zijn:
'F001', 'Dox', 'vinay', 'CustomAttr1:varchar(40):Akash, CustomUseDate:Datetime:2009/03/02'
Op deze manier heeft u slechts één enkele DB-query nodig en is de uitvoer eenvoudig te ontleden. Als je de attributen als echte Datetime enz. in de DB wilt opslaan, moet je dynamische SQL gebruiken, maar ik zou daar afstand van nemen en de waarden opslaan in varchars.