1

私は4つのテーブルを持っています。それらは、顧客、アイテム、画像、および仕様です。目標は、これら 4 つのテーブルを結合することです。現在、次のようにアイテムと画像を組み合わせています。

SELECT item_id, item_name, item_price,images_id, GROUP_CONCAT(images_fullname) AS images, images_itemid
FROM items
LEFT OUTER JOIN images ON item_id=images_itemid

しかし、3 番目のテーブル スペックに参加するにはどうすればよいでしょうか? specs には、spec_id、spec_itemid、spec_name、spec_value (specs は特定のアイテムの仕様) が含まれます。ベスト プラクティスは、Left Outer Joine をもう一度複製しないことだと思いますか?

私が必要とするレイアウトは次のとおりです。

Item name 1
image1, image2, image 3 (is working now with concat)
spec_name, spec_value
spec_name, spec_value
spec_name, spec_value

Item name 2
image1, image2, image 3 (is working now with concat)
spec_name, spec_value
spec_name, spec_value
spec_name, spec_value
4

2 に答える 2

3

外部結合は、結合されたテーブルが null になる可能性がある場合にのみ必要です。ここに当てはまるかどうかは明確ではありませんが、覚えておいてください。

SELECT
    various_columns
FROM
    items
    LEFT JOIN images ON item_id = images_itemid
    LEFT JOIN specs ON item_id = spec_itemid

別の結合を追加しても問題はありません。あなたはまだ重要な列に参加しています(私は推測しています)。

于 2013-02-15T01:47:42.533 に答える
1

私があなたの要求を正しく理解しているなら、それはあなたが選択した各アイテムのスペックテーブルにスペックのセットを持っているということですか?

この場合、いくつかの選択肢があります。

  1. アイテムごとに複数のレコード(画像/仕様などごとに1行)を取得する単一のクエリですべてを取得し、これをコードで分類します(非常に醜い)

  2. サブクエリとgroup concat、現在画像で行っているような仕様を使用します(これも厄介で、仕様のキーと値のペアの設定ではさらに厄介になると思います。

  3. DBを複数回呼び出して、コードでオブジェクトを構築します<-データモデルを正しく推測している場合は、これを処理する必要があると思います。

標準のアイテムフィールドに加えて、次のアイテムがあると想定しています。

  1. 写真の数
  2. アイテム固有のプロパティを指定するいくつかのキーと値のペア

そして、あなたが作成しようとしているものは、ショッピングサイトと同じですか?

あなたの靴の中で、私はこれを行うためにいくつかの別々のクエリを持っているでしょう(擬似コード):

 items = SELECT item_id, item_name, item_price,images_id FROM items

次に、これらのアイテムのforeachループで、オブジェクト指向言語を使用している場合は、ループ内のItemオブジェクトにリストを入力します。

foreach (item in items) {
   SELECT images_fullname, images_itemid FROM images WHERE item_id=images_itemid;
   // put into a list of type image in the item object
   SELECT * FROM specs WHERE item_id=spec_itemid;
   // put into a list of type spec in the item object 
}

DB呼び出しを減らし、この情報をコードにマージすることが懸念される場合(つまり、数千のアイテムをフェッチする場合)、結合のようなことを行うことになりますが、(たとえば)関心のあるすべてのアイテムの画像をフェッチします。 1つのクエリで、コード内のアイテムにマッピングします。

于 2013-02-15T02:40:47.720 に答える