mysql - 连接 3 个表,SUM() 来自其中 2 个表的值 (MYSQL)

标签 mysql sql

我对如何获取每个商品的购买数量投票数感到困惑。

执行两个简单的 JOIN 来连接以下 3 个表,会将 purchase_count 乘以 Votes 表中的条目数:

SELECT item_id, item_name, sum(backing_status) purchase_count, sum(vote) vote_count 
FROM Items
LEFT JOIN Purchases ON Items.item_id=Purchases.item_id
LEFT JOIN Votes ON Items.item_id=Votes.item_id
where purchase_status='bought' 
group by Items.item_id 

Table Items
item_id item_name
1           item_1
2           item_2
3           item_3

Table Purchases
item_id purchase_status 
1           bought          
2           bought          
1           bought          

Table Votes
item_id    vote 
1           1         
2           1          
3           -1         
1           -1
1           -1 

所需的输出是:

item_id item_name  purchase_count vote_count
1           item_1      2          -1 //sum of -2 downvotes + 1 upvote
2           item_2      1           1
3           item_3      0          -1

我可能需要子查询,但无法完全弄清楚查询。或者有更好的办法吗?

最佳答案

您应该能够使用以下代码,该代码使用具有两个聚合的子查询来获取结果:

select i.item_id,
  i.item_name,
  coalesce(p.TotalBought, 0)TotalBought,
  coalesce(v.vote_count, 0) vote_count
from items i
left join
(
  select item_id, count(*) TotalBought
  from purchases
  where purchase_status = 'bought'
  group by item_id
) p
  on i.item_id = p.item_id
left join
(
  select item_id, sum(vote) vote_count
  from votes
  group by item_id
) v
  on i.item_id = v.item_id;

参见SQL Fiddle with Demo

您也可以在没有两个子查询的情况下编写此代码,但您需要将 purchase_status 的 WHERE 过滤器放在 JOIN 上:

select i.item_id,
  i.item_name,
  count(p.item_id) TotalBought,
  coalesce(v.vote_count, 0) vote_count
from items i
left join purchases p
  on i.item_id = p.item_id
left join
(
  select item_id, sum(vote) vote_count
  from votes
  group by item_id
) v
  on i.item_id = v.item_id
group by i.item_id, i.item_name;

参见SQL Fiddle with Demo

关于mysql - 连接 3 个表,SUM() 来自其中 2 个表的值 (MYSQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17054467/

相关文章:

mysql - 使用 INSERT ... SELECT 避免表复制中的 InnoDB 事务开销

java - Apache Derby : Column reference 'xx' is invalid, 或者是无效表达式的一部分。

php - 是否可以自行连接单个表?

mysql - 获取 count(),其中 created_date 是累积的且基于日期

php - 使用排序函数对数据进行排序还是从数据库中检索排序?

python - 这个 python/mysql 查询是否容易受到 SQL 注入(inject)的影响

php - MySql 在一个单元格中存储对另一个表的多个引用并选择它?

php - 无法将 php 链接到数据库

sql - 插入删除的数据,加上一些硬编码值,输出语句

mysql - INNER JOIN 不限制结果