sql - MySQL - 如何 GROUP BY 另一个查询的结果?

标签 sql mysql subquery

我有一个访问表(visit_table),结构:

  • 身份证
  • IP_地址
  • 时间戳

和一个包含 IP 范围国家/地区名称的表(country_table)

  • 身份证
  • begin_IP(IP 范围的开始)
  • end_IP(IP 范围结束)
  • begin_num(begin_IP 的数字等价物,即 INET_ATON(begin_IP))
  • end_num
  • 国家代码(例如美国)
  • 国家名称
    (基于 http://www.maxmind.com/app/csv )

我使用的是 MySQL 5.0.67,我想编写一个查询来返回按国家/地区分类的访问次数,因此大致如下:

  SELECT country.table.country_name, 
         count(distinct visit_table.IP_address)  
    FROM country_table, visit_table  
   WHERE country_name = (SELECT country_name  
                           FROM country_table  
                          WHERE INET_ATON(visits.IP_address) >= begin_num  
                            AND INET_ATON( visits.IP_Address) <= end_num  
                          LIMIT 0,1 )  
GROUP BY country_table.country_name  

我很确定我做错了什么但不知道如何修复 - 某种 JOIN 或使用 SELECT 或 GROUP BY 语句做某事?欢迎任何指点!

最佳答案

使用:

  SELECT c.country_name, 
         COUNT(DISTINCT v.IP_address)  
    FROM COUNTRY_TABLE c
    JOIN VISIT_TABLE v ON v.country_name = c.country_name
   WHERE INET_ATON(v.IP_Address) BETWEEN begin_num AND end_num  
GROUP BY c.country_name

如果该 IP 范围没有国家/地区,您将一无所获。但是,如果范围内返回了多个国家/地区,则需要更新查询以进行处理。

如果您想要一个可能没有为其捕获 IP 地址的国家/地区,请使用:

   SELECT c.country_name, 
          COUNT(DISTINCT v.IP_address)  
     FROM COUNTRY_TABLE c
LEFT JOIN VISIT_TABLE v ON v.country_name = c.country_name
    WHERE INET_ATON(v.IP_Address) BETWEEN begin_num AND end_num  
 GROUP BY c.country_name

关于sql - MySQL - 如何 GROUP BY 另一个查询的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4235208/

相关文章:

mysql - SQL从连接中选择计数返回0而不是空结果

sql - 基于同一表的另一列更新sql表中一列的数据

java - 无法连接到 MS Access 数据库

java - 如何将这样的文件插入 MySQL 数据库

php - 从一个表中获取多行并存储到php Mysql中的另一个表

mysql - 我们建表的时候需要指定关系的基数吗?

mysql - 优化 yii2 的查询

mysql排序: will it work consistantly?解决方案

mysql - MySQL 和 Sphinx 混合查询

mysql - 使用子查询获取主查询的信息