我有一个访问表(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/