3

私がやりたいことに必要なクエリは、私の SQL の知識を超えているので、ここで助けを得たいと思っています。postgreSQL 9.2 で、複数のテーブルから 1 つのリレーションシップを取得したいと考えています。手順は知っているが、SQLは知らない。

このクエリに入る 4 つのテーブルがあります。

  • ウィッシュリスト: 1 つ以上のリストに関連付けられており、お気に入りのストアがあります
  • list_wishlist:リストとウィッシュリストの関係を保持します
  • item:リストに関連付けられており、お気に入りのストアがあります
  • preferred_stores:これは、ストアと優先ストア間の関係を保持します (各優先ストアは、prefered_store の個別の行です。したがって、アイテムまたはウィッシュリストに複数の優先ストアがある場合、prefered_store.id はそれらの行で同じになります)

テーブルは次のようになります (無関係な列は削除されています)。 ここに画像の説明を入力

結果のテーブルは次のようになります。 ここに画像の説明を入力

結果表について説明します。

  • item_id: そのまま、アイテムの ID
  • item_stores_comments:このアイテムに関連付けられたすべての preferred_stores 行からのストア/コメントのペア (コンマで区切られたストア/コメントと、セミコロンで区切られたペア)
  • wishlist_stores:このアイテムが含まれるリストに関連付けられているウィッシュリストの preferred_stored のストア ID (カンマ区切り)

上記の例のテーブルの実際の結果で item_info テーブルを埋めたので、それは明らかだと思いますが、何か得られない場合はお知らせください。

コメントで推奨されているように、SQLFiddle を作成しました: http://sqlfiddle.com/#!12/9fd60 画像と同じスキーマと値が含まれています。

4

1 に答える 1

3

これはあなたが望むことをするはずです:

WITH a AS (
  SELECT item.id, string_agg(prefered_store.store::varchar, ',') wishlist_stores
  FROM item, list_wishlist, wishlist, prefered_store
  WHERE item.list=list_wishlist.list
    AND list_wishlist.wishlist=wishlist.id
    AND wishlist.prefered_stores=prefered_store.id
  GROUP BY item.id
), b AS (
  SELECT item.id, 
    string_agg(
      prefered_store.store::varchar || ',' || prefered_store.comment,
      ' ; ') item_stores_comments
    FROM item, prefered_store
    WHERE item.prefered_stores=prefered_store.id
    GROUP BY item.id
)
SELECT a.id,item_stores_comments,wishlist_stores 
FROM a,b
WHERE a.id=b.id
于 2013-01-25T19:35:13.963 に答える