gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:17:14 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com