mysql - 左连接、求和和计数组依据

标签 mysql sql

我有 3 张 table :商品、商店和图片。在第一个表中存储商品名称。在第二个 - 不同库存中的商品余额,在第三个 - 链接到商品图片。因此商品与商店和图片具有一对多的联系。 现在,我需要通过一次查询来获取包含库存总和和图片数量的商品 list 。 我是这样做的:

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 - storerest doubles 时,我不明白为什么。 怎么了?

最佳答案

您的问题是,当您有两个(或更多)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) 

关于mysql - 左连接、求和和计数组依据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14967160/

相关文章:

php - 无法获取未序列化的数据

mysql - 在Delphi中找不到libmysql.dll和其他从ZeosLib连接到MYSQL的文件

mysql - 如何使用触发器为非主键列添加自动增量

java - jdbc何时填写为executeBatch()编写的准备语句的 '?'

sql - INSERT INTO ... RETURNING 多列 (PostgreSQL)

mysql - 从连接表中选择类别并连接以形成列表结果

MySql 与关系表的多重联接

Mysql按天搜索

java - 如何使用java准备语句更新mysql时间戳列?

mysql - SQL - 为员工建模角色