假设有两张表
* ----------------- 1
site_visits sites
site_id | visits site_id
1 | 15 1
1 | 10 2
2 | 20 3
2 | 45
3 | 55
目的是统计有多少个网站的访问量超过 50 次。 DBMS 是 MySQL 和 InnoDB。需要注意的是,必须有一个联接,因为两个表的列上都有 where 子句(在更大的图中)。
我已经成功地用 FROM 中的子查询编写了这个;从上面的数据来看,它应该产生值 2,因为有 2 个这样的站点,id 2 和 3 的总和分别为 65 和 55,而 id 1 的总和仅为 25。
select count(*)
from (
select sum(visit.visits) as visits_sum
from sites site
join site_visits visit
on site.site_id = visit.site_id
group by site.site_id) as sub_sum
where visits_sum < 50
但是我希望在 FROM 中不使用子查询来编写此代码,以便能够将其与 ORM 一起使用;到目前为止我所管理的是:
select count(site.site_id)
from sites site
join site_visits visit
on site.site_id = visit.site_id
group by site.site_id
having sum(visit.visits) < 50
如果没有 group by,它会对整个连接表求和并得出 3。有了它,它会返回与总计数一样多的条目,在本例中为 2。这些条目的值为 2 和 1(因为有连接表中有 2 个 id 为 2 的条目和 1 个 id 为 3 的条目)。像 count(count(...))
这样的东西可能会做到这一点,但这是不允许的。
最佳答案
好的,如果您使用的是 MySQL 8.0.2 及以上版本,那么您可以使用窗口函数。我省略了 site
表,因为该示例实际上并不需要它。
select distinct count(count(site_visits.site_id)) over ()
from site_visits
group by site_visits.site_id
having sum(site_visits.visits) > 50
关于mysql - 在 JOIN 中写入具有 HAVING 总和限制的 SQL 计数,而无需在 FROM 中使用子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47174330/