私は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
するアイテムに関連する行に対してのみ実行する必要があります。b
a
私は次のことを試みました:
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
それをどのように追加しますか?