SQL,如何在范围内计算行数

3
我有两个表:
一个是 a_tbl(uid, login_ip, login_time),其中ip是32位整数,time是Unix时间戳。
另一个是 b_tbl(country, province, city, ip_from, ip_to)
我想知道b_tbl中每个范围内有多少个唯一的a_tbl中的uid。
请注意,b_tbl有很多唯一的行,而a_tbl中可能存在重复的uid。
非常感谢。

1
这两个表之间有什么关联? - John Woo
两个表之间是否存在关联? - punter
我看不出这两个表之间有任何关系!那么这里的问题是什么? - Sylca
你可能需要在“ip inside ip-range”上连接表格,然后计算每个ip_range内的元组数量。 - wildplasser
login_ip 是在某个范围 [ip_from, ip_to] 内的无符号整数。 - user1928099
3个回答

2

要实现这个功能,您可以编写一个使用BETWEEN作为谓词的JOIN语句。这将开发出范围;然后,只需计算落在每个范围内的项目数量即可。像这样的代码应该能让您入门:

SELECT b_tbl.ip_From, b_tbl.ip_to, COUNT(a_tbl.login_ip)
  FROM a_tbl
  JOIN b_tbl ON a_tbl.login_ip BETWEEN b_tbl.ipfrom AND b_tbl.ip_to
GROUP BY  b_tbl.ip_From, b_tbl.ip_to;

1
也许你的意思是 COUNT(DISTINCT a_tbl.uid) - John Woo
在您编辑之前,您的问题并没有明确指出您需要唯一性。现在您已经明确表示您想要每个范围内的唯一IP地址,那么COUNT(DISTINCT)确实是必需的。 - MikeB

1

试试这个:

SELECT ip_from
    , ip_to
    , COUNT(distinct uid) as NumberOfUniqueUserId
FROM a_tbl
INNER JOIN b_tbl on login_ip BETWEEN ip_from AND ip_to
GROUP BY ip_from
    , ip_to

0
SELECT city, count(uid)
FROM (
  SELECT DISTINCT A.uid, B.city
  FROM a_tbl A 
       LEFT JOIN b_tbl B 
                 ON A.login_ip >= B.ip_from AND A.login_ip <= B.ip_to
)
GROUP BY city

问题似乎要求按IP范围分组,而不是按省份分组。 - Barmar
我认为b_tbl中的每一行都代表一个IP范围,进而给出了用户的地理位置。您可以按城市、省份、国家或任何您拥有的信息进行分组。 - e-mre
但是你会得到与他要求的不同的结果。一个省可能有多个IP范围。 - Barmar
有意义,我把它改成了“城市”。 - e-mre
我不知道你所在的网络环境如何,但在这里,相邻公寓的两个人可能处于不同的IP范围内(该镇有3个不同的ISP提供服务)。为什么不像他说的那样分组呢? - Barmar
我有点觉得“city”会是主键。无论如何,只要SQL语句的结构正确,OP可以按照自己的喜好进行更改。 - e-mre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接