質問はMySQLに言及しており、実際、このDBMSにはこの種の問題に対する特別な機能があります:GROUP_CONCAT(expr)
。 MySQLリファレンスをご覧くださいgroup-by-functionのマニュアル
。この関数はMySQLバージョン4.1で追加されました。 GROUP BY FileID
を使用します クエリで。
結果をどのように表示するかはよくわかりません。すべてのアイテムにすべての属性をリストしたい場合(設定されていない場合でも)、それは難しくなります。しかし、これはそれを行う方法についての私の提案です:
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;
これにより、すべての属性が同じ順序で表示されるため、便利な場合があります。出力は次のようになります:
'F001', 'Dox', 'vinay', 'CustomAttr1:varchar(40):Akash, CustomUseDate:Datetime:2009/03/02'
このように、必要なDBクエリは1つだけで、出力は簡単に解析できます。属性を実際の日時などとしてDBに格納する場合は、動的SQLを使用する必要がありますが、それを避けて値をvarcharsに格納します。