我有 3 张 table :
商店
,主键cid,zbid
shop_items
,主键id
shop_inventory
,主键id
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
值相加来完成。我该如何添加它?
最佳答案
尝试这个解决方案:
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
关于php - 跨 3 个表的复杂多重联接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12186870/