繁体   English   中英

左连接,总和和计数组

[英]Left join, sum and count group by

我有3张桌子:商品,商店和照片。 在第一个表中存储商品标题。 在第二个 - 不同股票的货物余额,在第三个 - 货物图片的链接。 所以商品与商店和照片有一对多的联系。 现在,我需要通过一个查询获得具有库存休息和图片数量的商品列表。 我是这样做的:

SELECT good.id, good.title, sum(store.rest) AS storerest, count(pics.id) AS picscount 
FROM goods 
LEFT JOIN store ON (goods.id = store.goodid) 
LEFT JOIN pics ON (goods.id = pics.goodid) 
GROUP BY goods.id`

一切似乎都好,而好有0或1张图片。 但是当它有2个 - 存储器双打时,我无法理解为什么。 怎么了?

您的问题是,当您有一个goods行的两个(或更多) store行和两个(或更多) pics行时,您最终会获得所有行组合的产品。

要解决此问题,请在加入之前进行聚合:

SELECT 
  good.id, 
  good.title, 
  IFNULL(s.storerest, 0) AS storerest, 
  IFNULL(p.picscount, 0) AS picscount
FROM goods 
LEFT JOIN (
  SELECT goodid, sum(rest) AS storerest
  FROM store
  GROUP BY goodid
) s ON (goods.id = s.goodid) 
LEFT JOIN (
  SELECT goodid, count(id) AS picscount
  FROM pics
  GROUP BY goodid
) p ON (goods.id = p.goodid) 

首先考虑连接的大小。 如果一张商品有两张图片,那么这件商品的行数会增加一倍。 实际上行将是重复的,但对于图片部分。 因此,store.rest的总和将两次拿起所有东西。 使用三张图片,您将获得三倍的输出。

您将表'货物'与另外两个表连接在一起,其中这两个表与'货物'表具有一对多的关系。 当它们被连接时,将产生行的组合 - 因此如果有2个图片,则存储项目被列出两次。

如果您首先计算子表的统计数据然后加入它们并在计算唯一项时使用不同的计数,那么解决此问题的最简单方法是,例如,您的查询应该是:

SELECT good.id, good.title, sum_rest AS storerest, count(distinct pics.id) AS picscount 
FROM goods 
LEFT JOIN (select goodid, sum(rest) as sum_rest from store) s ON (goods.id = s.goodid) 
LEFT JOIN pics ON (goods.id = pics.goodid) 
GROUP BY goods.id

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM