Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-如何根据另一个查询的结果进行分组?_Sql_Mysql_Subquery - Fatal编程技术网

MySQL-如何根据另一个查询的结果进行分组?

MySQL-如何根据另一个查询的结果进行分组?,sql,mysql,subquery,Sql,Mysql,Subquery,我有一个访问表访问表,结构: 身份证件 IP地址 时间戳 以及一个带有IP范围国家名称的表country_表 身份证件 开始\u IP IP范围的开始 结束\u IP IP范围的结束 begin_num begin_IP的数字等价物,即INET_ATONbegin_IP 尾数 国家/地区代码,例如美国 国名 基于 我使用的是MySQL 5.0.67,我想写一个查询来返回各个国家的访问次数,因此大致如下: SELECT country.table.country_name,

我有一个访问表访问表,结构:

身份证件 IP地址 时间戳 以及一个带有IP范围国家名称的表country_表

身份证件 开始\u IP IP范围的开始 结束\u IP IP范围的结束 begin_num begin_IP的数字等价物,即INET_ATONbegin_IP 尾数 国家/地区代码,例如美国 国名 基于 我使用的是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  
我很确定我做错了什么,但不知道如何修复——某种连接,或者使用SELECT或GROUPBY语句做了什么?欢迎指点

是,您想要加入:

SELECT country_table.country_name, count(distinct visit_table.IP_address)  
FROM country_table
RIGHT JOIN visit_table ON visit_table.id=country_table.id       
GROUP BY country_table.country_name  
是,您想要加入:

SELECT country_table.country_name, count(distinct visit_table.IP_address)  
FROM country_table
RIGHT JOIN visit_table ON visit_table.id=country_table.id       
GROUP BY country_table.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
使用:

如果没有国家的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

@Pentium10:按使用较少字节存储值的数据类型进行分组或联接的性能应该更好。可能会考虑索引,但会对插入/更新/删除查询产生负面影响…@Pentium10:按使用较少字节存储值的数据类型进行分组或连接应该会执行得更好。可以考虑使用索引,但会对INSERT/UPDATE/DELETE查询产生负面影响……我认为可以在GROUPBY子句中以subselect的形式编写select语句。这在Oracle上有效,也许在mysql上也有效。有人能证实这一点吗?我认为您可以在GROUPBY子句中以subselect的形式编写select语句。这在Oracle上有效,也许在mysql上也有效。有人能证实这一点吗?