mysql - 在 JOIN 中写入具有 HAVING 总和限制的 SQL 计数,而无需在 FROM 中使用子查询

标签 mysql sql database join aggregate-functions

假设有两张表

    *   -----------------   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

demo

关于mysql - 在 JOIN 中写入具有 HAVING 总和限制的 SQL 计数,而无需在 FROM 中使用子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47174330/

相关文章:

database - 我如何在事件服务器页面上实现分页(ASP Classic)

MySQL + phpMyAdmin,IF 语句触发器语法错误

python + sqlalchemy : calling stored procedures in a loop

sql - 如何在 SQL 数据库中存储绝对和相对日期范围?

php - 使用 PHP 从 SQL 数据库传递选择值

MySQL 查询根据年/月/日获取记录列表

sql - Django ORM 与 PostgreSQL 原始 sql

javascript - 如何防止在浏览器控制台中使用 firebase.database() ?

MySQL:仅显示两个表中不存在id的行的单个查询

php - 同步本地和远程 MySQL 数据库