又做一道数据库题

题目:查询统计db日志每天连接数前20名的ip
在数据库中的访问记录数据如下

66.jpg

解决如下

-- 解决思路:变量@row用来做rownum,变量@mid用来分组。最里层的sql语句通过group by与order by语句获取分组统计好的数据集,即进行日期和IP分组统计后的排序后的数据、
-- 因为数据集合已经是按访问量倒序排列,第一条必然是访问量最多的,而他是第一次出现,rownum必然是1,第二条同日期出现,rownum增长1
-- 以此类推rownum会一直加到这个日期全部,这好比给这个每个日期内(按访问量倒序后)的文章都加了一个增长id,然后id<10自然就是前10条

SET @row=0; SET @mid= ''; 
SELECT T2.* FROM (
        SELECT T.*,case WHEN @mid=access_date THEN @row:=@row+1 ELSE @row:=1 END rownum,@mid:=access_date mid FROM (
            SELECT remote_add,left(time,11) as access_date,count(remote_add) as access_count from access_log GROUP BY remote_add,access_date ORDER BY access_date,access_count desc
        ) AS T ) AS T2
WHERE T2.rownum<=5

效果如下

33.jpg


标签: none

非特殊说明,本博所有文章均为博主原创。

最新文章

发表评论