博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一条SQL查询访问记录表(visit_log)中某个类目(catalog_id)的访问量(visit)排前两名的记录行...
阅读量:4459 次
发布时间:2019-06-08

本文共 3090 字,大约阅读时间需要 10 分钟。

原来看过一篇文章,如下

----------------------------------------------------------------------------------------------------------------

sql server查询每门课程的前两名的学生编号,课程编号,成绩并排序

 

数据结构介绍:

成绩表(编号,学号,科目编号,成绩)

SQL基础了解:

select * from 成绩表 

对于Sql Server它查询的过程是逐条查询的,也就是一条一条记录进行查询的;

那么我们可以先思考下,当它查“成绩表”时,第一条成功后才查询第二条的;

 

假设查特定的一门科目的最高分值前2条记录:

select top 2 * from 成绩表  where 科目编号=1  order by 成绩 DESC

 

 那么当要查询每一门科目成绩的前两条,就可以这样思考:

select  查询到第一条时,会得到 (编号,学号,科目编号,成绩),

那么这一条记录是否符当前成绩是当前科目最高分的前两条件呢?

上边已经处理为取前两条的方法了,那么这里进行下应该就可以了:

select 学号,科目编号,成绩 from 成绩表 AS A

where 学号 in

 (

select top 2 学号 from 成绩表 AS B  where B.科目编号= A.科目编号  order by 成绩 DESC

)

 

 上面的脚本可以理解为:

因为查询是逐条的,所以(黄色区域)可以理解为,当第一条数据获取后就进行条件判断;

学号是否存在于当前记录中科目最高成绩的前两条;

子查询部分就是当前这条记录的科目最高成绩的前两个学号

 

----------------------------------------------------------------------------------------------

 

现在遇到了一个这样的问题

一条SQL查询访问记录表(visit_log)中某个类目(catalog_id)的访问量(visit)排前两名的记录行

表结构

按照上文的写法,那么应该这样写

select    id,    catalog_id,     visit from     visit_log as a where     id in (        select            id        from            visit_log as b        where            a.catalog_id = b.catalog_id        order by            visit desc        limit 2    ) as c

但是这么写是不行的, 因为mysql不支持在子查询中使用limit, 会报如下错误

14:19:12 select id, catalog_id, visit from visit_log as a where id in ( select id from visit_log as b where a.catalog_id = b.catalog_id order by visit desc limit 2 ) Error Code: 1235. This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' 0.000 sec

网上有说过解决这个问题的方法,有如下几个

 

1). 多加一个select id 到子查询中

select     id,    catalog_id,     visit from     visit_log as a where     id in (        select             id         from (            select                id            from                visit_log as b            where                a.catalog_id = b.catalog_id            order by                visit desc            limit 2        ) as c    )

报错

14:44:59 select id, catalog_id, visit from visit_log as a where id in ( select id from ( select id from visit_log as b where a.catalog_id = b.catalog_id order by visit desc limit 2 ) as c ) Error Code: 1054. Unknown column 'a.catalog_id' in 'where clause' 0.000 sec

2) 将子查询挪到from里,这种显然不行,因为我的子查询有 a.catalog 这个信息,如果移动到子查询就会变为

select     id,    catalog_id,     visit from     select             id         from (            select                id            from                visit_log as b            where                a.catalog_id = b.catalog_id            order by                visit desc            limit 2        ) as c

 

 

那么,我们只能避开in和exists, 使用 score 来定位这前两名, 如下

select     a . *from    visit_log as awhere    visit >= (select             visit        from            visit_log as b        where            a.catalog_id = b.catalog_id        order by visit desc        limit 1 , 1)order by catalog_id asc , visit desc

 

结果

 

最后,还有一种非常神奇的用法,如下:

select     id,    catalog_id,     substring_index(        group_concat(            visit order by visit desc        ),         ',',         2    )      from     visit_loggroup by    catalog_id

输出结果

 

转载于:https://www.cnblogs.com/zemliu/archive/2012/09/26/2703290.html

你可能感兴趣的文章
获取请求参数乱码的问题
查看>>
代码实现:判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称...
查看>>
Android客户端测试点
查看>>
Jquery:怎样让子窗体的div显示在父窗体之上
查看>>
01概率
查看>>
Shell脚本
查看>>
MatLab Load cv::Mat 导入数据
查看>>
html+css相关笔记(一)
查看>>
基于块流协议保证音频优先发送
查看>>
关于互联网的一些数据
查看>>
数据预处理:独热编码(One-Hot Encoding)
查看>>
python将对象名的字符串类型,转化为相应对象的操作方法
查看>>
【NLP新闻-2013.06.03】New Book Where Humans Meet Machines
查看>>
mongodb安装4.0(rpm)
查看>>
DispatcherServlet的url mapping为“/”时,对根路径访问的处理
查看>>
备忘pwnable.kr 之passcode
查看>>
好久没敲代码了,手有点生——一个小小的时钟
查看>>
运算符 AS和IS 的区别
查看>>
(转)详解C中volatile关键字
查看>>
easyui时的时间格式yyyy-MM-dd与yyyy-MM-ddd HH:mm:ss
查看>>