これには 2 つのクエリが必要です。最初に次を選択しますFile
。
SELECT * FROM File WHERE (...)
次に、以下をフェッチしAttributes
ます。
SELECT *
FROM AttValues
JOIN Attributes ON (Attributes.AttId = AttValues.AttId)
WHERE FileId = $id
後者のクエリでは、 ごとAttribute
に 1 つの行が提供され、フロントエンドで表示するためにプログラムでピボットできます。
foreach(row in result) {
table.AddColumn(Header = row['AttName'], Value = row['AttValue']);
}
必要に応じてローカルのプログラミング環境に適応させます。
もちろん、これは同じ属性を持つ1 つFile
または複数の に対してのみ機能します。File
異なる複数のファイルを表示したい場合は、代わりにすべての sAttributes
をプリフェッチできます。AttName
SELECT Attributes.AttId, Attributes.AttName
FROM Attributes
JOIN AttValues ON (Attributes.AttId = AttValues.AttId)
WHERE FileId IN ( $list_of_ids )
次に、次のように値をロードします。
SELECT *
FROM AttValues
WHERE FileId IN ( $list_of_ids )
ローカル連想配列を使用して、AttId
s から列インデックスにマップします。
最終的な最適化として、最後の 2 つのクエリを に結合してOUTER JOIN
、3 回目のラウンド トリップを回避できます。これにより転送されるデータ量が増える可能性がありますが、クラス ライブラリが名前付き列をサポートしている場合は、テーブルへの入力も容易になります。