1

ひぃ、

次のようなデータベース設計があります。

Table File (FileID, Name, Details)

Table Attributes (AttID, AttName, AttType)

Table AttValues (FileID, AttID, AttValue)

Attributes実行時まで、a に含まれる数と名前は不明Fileです。

そして、次のような方法でフロントエンドに挿入後に表示したい:

FileID, FileName, Details, (Rows of Attribute Table as Column here).

つまり、このピボット結果を達成するために Java または MySQL のコードを提供してくれる人はいますか?

貴重な時間をありがとうございました。

または、目的の結果を簡単に取得できるように、データを保存するための他のより良い方法はありますか。

4

2 に答える 2

1

これには 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 )

ローカル連想配列を使用して、AttIds から列インデックスにマップします。

最終的な最適化として、最後の 2 つのクエリを に結合してOUTER JOIN、3 回目のラウンド トリップを回避できます。これにより転送されるデータ量が増える可能性がありますが、クラス ライブラリが名前付き列をサポートしている場合は、テーブルへの入力も容易になります。

于 2009-04-04T07:17:42.760 に答える
1

最近、同様の質問に答えました: How to pivot a MySQL entity-attribute-value schema。答えは MySQL 固有ですが、質問に mysql のタグが付けられているので問題ないと思います。

于 2009-04-04T10:28:02.303 に答える