左连接,总和和计数组

set*_*rul 14 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`
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*son 27

你的问题是,当你有两个(或更多)store的行和两个(或更多)pics行单个goods行,你最终行的所有组合的产品.

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

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) 
Run Code Online (Sandbox Code Playgroud)