左连接,总和和计数组

时间:2013-02-19 20:51:33

标签: mysql sql

我有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个 - 存储器双打时,我无法理解为什么。 怎么了?

3 个答案:

答案 0 :(得分:23)

您的问题是,如果您有一行({1}}行有两个(或更多)store行和两个(或更多)pics行,那么您的最终产品是所有行的组合。

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

goods

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您将表'货物'与其他两个表连接在一起,其中这两个表与“货物”表具有一对多的关系。当它们被连接时,将产生行的组合 - 所以如果有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