SELECT caller_number, called_number FROM ( SELECT caller_number, called_number, call_start_time, IF(called_number=@prev_called_number, @cnt:=@cnt+1, @cnt:=1) AS cnt, @prev_called_number:=called_number FROM call_records, (SELECT @prev_called_number:=NULL, @cnt:=1) AS vars WHERE call_start_time >= DATE_SUB(NOW(), INTERVAL 2 HOUR) AND caller_number NOT LIKE '0%' ORDER BY called_number, call_start_time ) AS t WHERE cnt >= 5
时间: 2024-04-01 10:36:36 浏览: 7
您好!这是一个 MySQL 查询语句,用于获取最近 2 小时内,被至少 5 个不同主叫号码呼叫过的被叫号码列表。具体来说,它是通过对 call_records 表进行子查询,获取在指定时间范围内的呼叫记录,并按被叫号码和呼叫时间排序。然后通过使用 MySQL 中的 IF 函数和变量,对相邻的呼叫记录的被叫号码进行比较,统计出每个被叫号码被呼叫的次数。最后,将统计结果进行过滤,只保留被至少 5 个不同主叫号码呼叫过的被叫号码列表。如果您还有其他问题或需要更多帮助,请告诉我。
相关问题
called_number IN ( SELECT called_number FROM call_records WHERE call_start_time >= DATE_SUB(NOW(), INTERVAL 2 HOUR) AND caller_number NOT LIKE '0%' GROUP BY called_number HAVING COUNT(DISTINCT caller_number) >= 5 )分析这段sql
好的,这段 SQL 是使用了子查询,大致的意思是:
首先,从 `call_records` 表中选取满足以下条件的 `called_number` 列:对于 `call_start_time` 在过去两小时之内的通话记录,且 `caller_number` 不以 `0` 开头,然后按照 `called_number` 进行分组,最后筛选出满足被不少于 5 个不同的 `caller_number` 所拨打过的号码。
然后,将满足条件的 `called_number` 列作为子查询的结果,用于筛选主查询中的数据,保留满足条件的行。具体来说,主查询会查找 `called_number` 列中的值在子查询中出现过的行。
总的来说,这段 SQL 的作用是筛选出在过去两小时内被不少于 5 个不同的用户拨打过的号码。
caller_number NOT LIKE '0%' AND LENGTH(caller_number) > 5 AND LENGTH(caller_number) < 16 AND LENGTH(called_number) > 5 AND LENGTH(called_number) < 16 AND (SELECT COUNT(*) FROM call_records WHERE caller_number=cr.caller_number AND called_number=cr.called_number AND call_start_time >= DATE_SUB(NOW(), INTERVAL 2 HOUR)) >= 10分析这段代码
这段代码是一个SQL语句的查询条件,其中包含了多个限制条件:
1. caller_number不以0开头;
2. caller_number和called_number的长度在6到15之间;
3. 查询与当前时间相差两小时以内的通话记录;
4. 同一个caller_number和called_number对应的通话记录数量要大于等于10。
这段代码的目的是查询满足上述限制条件的通话记录。其中第4个条件可以用于过滤出经常通话的号码。