php - 跨 3 个表的复杂多重联接查询

标签 php mysql join

我有 3 张 table :

商店,主键cid,zbid
shop_items,主键id
shop_inventory,主键id

shops a 通过以下方式与 shop_items b 相关:a.cid=b.cid AND a.zbid=b.szbid shopsshop_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/

相关文章:

php - 正确使用PHP : header ('Content-language: ...' );

Postgresql - 行到列

mysql - 合并同一个表中的 2 个字段?

mysql - SQL。当列不存在时左连接和空值

php - paypal交易后如何让 "thank you"页面只对用户可见?

php - 为什么 SUM (`column` ) 返回一个字符串而不是一个整数?

mysql - MySQL 中的简单百分比计算

mysql - 优先考虑找到匹配项的那些字段

javascript - 只有手机safari打不开页面,没有网络消息

mysql - 什么是表空间,为什么要使用它?