0

私は3つのテーブルを持っています:

shops、PRIMARY KEY cid,zbid
shop_items、PRIMARY KEY id
shop_inventory、PRIMARY KEYid

shops a以下によって関連しshop_items bています:a.cid=b.cid AND a.zbid=b.szbid shops直接関連していませんshop_inventory

shop_items b以下によって関連しshop_inventory cています:b.cid=c.cid AND b.id=c.iid

a.*ここで、 (からのすべての列)を返すクエリを実行したいと思いますshops。それは次のようになります:

SELECT a.* FROM shops a WHERE a.cid=1 AND a.zbid!=0

WHERE句が必要であることに注意してください。

次に、各ショップのアイテム数を返します。

SELECT
  a.*,
  COUNT(b.id) items
FROM shops a
LEFT JOIN shop_items b ON b.cid=a.cid AND b.szbid=a.zbid
WHERE a.cid=1
GROUP BY b.szbid,b.cid

ご覧のとおり、これを機能させるためのGROUP BY句を追加しました。

次に、店内の各商品の平均価格を返したいと思います。これはそれほど難しいことではありません:

SELECT
  a.*,
  COUNT(b.id) items,
  AVG(COALESCE(b.price,0)) average_price
FROM shops a
LEFT JOIN shop_items b ON b.cid=a.cid AND b.szbid=a.zbid
WHERE a.cid=1
GROUP BY b.szbid,b.cid

私の次の基準は、それが複雑になるところです。また、各ショップのユニークなバイヤーを返品したいと思います。これは、クエリshop_inventory cを実行して、を取得することで実行できますCOUNT(DISTINCT c.zbid)。ここで、これらのテーブルがどのように関連しているかを思い出してください。これは、それぞれのショップが所有cするアイテムに関連する行に対してのみ実行する必要があります。ba

私は次のことを試みました:

SELECT
  a.*,
  COUNT(b.id) items,
  AVG(COALESCE(b.price,0)) average_price,
  COUNT(DISTINCT c.zbid)
FROM shops a
LEFT JOIN shop_items b     ON b.cid=a.cid AND b.szbid=a.zbid
LEFT JOIN shop_inventory c ON c.cid=b.cid AND c.iid=b.id
WHERE a.cid=1
GROUP BY b.szbid,b.cid

itemsただし、値を台無しにしたため、これは機能しませんでした。この結果を達成するための適切な方法は何ですか?

また、各店舗での購入総数を返品できるようにしたいと思います。これは、各ショップの価値を調べてshop_inventory c合計することによって行われます。c.quantityそれをどのように追加しますか?

4

2 に答える 2

2

このソリューションを試してください:

SELECT    a.*,
          COALESCE(b.item_cnt,  0) AS item_cnt,
          COALESCE(b.avg_price, 0) AS avg_price,
          COALESCE(b.buyer_cnt, 0) AS buyer_cnt
FROM      shops a
LEFT JOIN (
          SELECT    a.cid, 
                    a.szbid, 
                    COUNT(*)     AS item_cnt, 
                    AVG(a.price) AS avg_price,
                    b.buyer_cnt
          FROM      shop_items a
          LEFT JOIN (
                    SELECT   cid,
                             iid,
                             COUNT(DISTINCT zbid) AS buyer_cnt
                    FROM     shop_inventory
                    WHERE    cid = 1
                    GROUP BY cid, 
                             iid
                    ) b ON a.cid = b.cid AND a.id = b.iid
          WHERE     a.cid = 1 AND
                    a.szbid <> 0
          GROUP BY  a.cid,
                    a.szbid
          ) b ON a.cid = b.cid AND a.zbid = b.szbid
WHERE     a.cid = 1 AND 
          a.zbid <> 0
于 2012-08-29T21:49:31.593 に答える
1

COUNT(DISTINCT c.zbid)+の代わりにLEFT JOIN shop_inventory、副選択を書くことができます:

SELECT
  a.*,
  COUNT(b.id) items,
  AVG(COALESCE(b.price,0)) average_price,

  ( SELECT COUNT(DISTINCT c.zbid)
    FROM shop_inventory c
    WHERE c.cid=b.cid AND c.iid=b.id
  )

FROM shops a
LEFT JOIN shop_items b     ON b.cid=a.cid AND b.szbid=a.zbid
WHERE a.cid=1
GROUP BY b.szbid,b.cid
于 2012-08-29T21:49:32.717 に答える