A questão menciona o MySQL, e na verdade este SGBD tem uma função especial para este tipo de problema:
GROUP_CONCAT(expr)
. Dê uma olhada na referência do MySQL manual sobre agrupar por funções
. A função foi adicionada no MySQL versão 4.1. Você usará GROUP BY FileID
na consulta. Não tenho muita certeza sobre como você quer que o resultado fique. Se você quiser todos os atributos listados para cada item (mesmo se não estiver definido), será mais difícil. No entanto, esta é a minha sugestão de como fazê-lo:
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;
Isso fornece todos os atributos na mesma ordem, o que pode ser útil. A saída será como a seguinte:
'F001', 'Dox', 'vinay', 'CustomAttr1:varchar(40):Akash, CustomUseDate:Datetime:2009/03/02'
Dessa forma, você só precisa de uma única consulta de banco de dados e a saída é fácil de analisar. Se você quiser armazenar os atributos como Datetime real etc. no banco de dados, você precisaria usar SQL dinâmico, mas eu ficaria claro disso e armazenaria os valores em varchars.