sql - 如何在 SQL 的嵌套连接中使用 GroupBy
问题描述
以下 SQL 语句返回用户名、IP 地址、持续时间、流量和上次访问。
SELECT username, SUBSTRING_INDEX( callingstationid, '=', 1 ) as IP,
SUM(acctsessiontime) as `duration`, count(username) as Count,
(SUM(`acctinputoctets`)+SUM(`acctoutputoctets`))/1000/1000/1000 as GBytes,
MAX(acctstoptime) as `last visit`
FROM radacct
GROUP BY username
我想将此与 Country 表一起加入,并按国家/地区分组,以便我知道每个国家/地区使用了多少流量以及该国家/地区的最后一次访问是什么时候。
我无法正确加入:
SELECT c.country,
round(GBytes, 2),
Count,
duration as `Total Time Spent`,
`last visit`
FROM (
SELECT username,
SUBSTRING_INDEX( callingstationid, '=', 1 ) as IP,
SUM(acctsessiontime) as `duration`, count(username) as Count,
(SUM(`acctinputoctets`)+SUM(`acctoutputoctets`))/1000/1000/1000 as GBytes,
MAX(acctstoptime) as `last visit`
FROM radacct
GROUP BY username
) filtered_radacct
JOIN u_cache_db.`global_ip` c ON c.ip = filtered_radacct.IP
GROUP BY c.country
order by GBytes DESC;
我知道这个数字不可能是正确的。
解决方案
您还需要顶级查询中所有字段的聚合函数,即
SELECT c.country,
round(SUM(GBytes), 2),
SUM(Count),
SUM(duration) as `Total Time Spent`,
MAX(`last visit`)
推荐阅读
- reactjs - 映射和对象并将道具发送给孩子不会返回任何东西
- laravel - 使用数据库会话驱动程序时如何获取用户的会话?
- maven - 使用 Maven 创建战争并在 jboss 上部署
- angular - Angular 6:从 HTTPS 打印到 HTTP 打印机
- rest - Linkedin share/ugc post api is not providing posts
- smalltalk - Smalltalk - iterate over a dict array with conditions
- flutter - 覆盖 SearchDelegate 的过渡动画
- javascript - Using variables as greater than / less than operators in a loop
- tomcat - 为什么即使默认端口(BranchCache 内容检索(HTTP-In))80 在 Windows 防火墙中打开,GCP 实例也需要手动允许端口 80
- python - 扩展存根中通用但在运行时不通用的基础时可能的循环定义