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

时间:2010-11-20 21:54:31

标签: sql mysql subquery

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

  • ID
  • IP_address
  • 时间戳

和表格(country_table),其中包含IP范围的国家/地区名称

  • ID
  • begin_IP(IP范围的开始)
  • end_IP(IP范围的结尾)
  • begin_num(begin_IP的数字等价物,即INET_ATON(begin_IP))
  • end_num
  • country_code(例如美国)
  • COUNTRY_NAME
    (基于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语句做某事?欢迎任何指示!

2 个答案:

答案 0 :(得分:3)

使用:

  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

答案 1 :(得分:1)

是的,你想加入:

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