一条SQL查询访问记录表(visit_log)中某个类目(catalog_id)的访问量(visit)排前两名的记录行
2012-09-26 01:26
323 查看
原来看过一篇文章,如下
----------------------------------------------------------------------------------------------------------------
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)排前两名的记录行
表结构
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/83b868b5c8421850c7de532a6d1fcbd7.png)
按照上文的写法,那么应该这样写
但是这么写是不行的, 因为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 到子查询中
报错
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 这个信息,如果移动到子查询就会变为
那么,我们只能避开in和exists, 使用 score 来定位这前两名, 如下
结果
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/18aef01788ba9a5847a8663e0eec1dfb.png)
最后,还有一种非常神奇的用法,如下:
输出结果
----------------------------------------------------------------------------------------------------------------
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)排前两名的记录行
表结构
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/83b868b5c8421850c7de532a6d1fcbd7.png)
按照上文的写法,那么应该这样写
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 a where 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
结果
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/18aef01788ba9a5847a8663e0eec1dfb.png)
最后,还有一种非常神奇的用法,如下:
select id, catalog_id, substring_index( group_concat( visit order by visit desc ), ',', 2 ) from visit_log group by catalog_id
输出结果
![](https://oscdn.geek-share.com/Uploads/Images/Content/202010/11/cdcd36f27003fb58bf10be4a9a962f1f.png)
相关文章推荐
- Oracle 删除重复数据只留一条 查询及删除重复记录的SQL语句 1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 wher
- sql查询 如何获取查找某ID的一条记录在表中是第几条记录
- sql 插入一条记录并查询出记录的id值
- Oracle 删除重复数据只留一条 查询及删除重复记录的SQL语句 1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 wher
- SQL根据Id来查询一条记录或全部记录
- 如何查询数据库中ID的最新的一条记录 - MS-SQL Server / 基础类
- 数据库中随机查询一条记录的SQL语句
- sql 中实现往表中插入一条记录并返回当前记录的ID
- 写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的。
- 【SQL】一条查询中统计同一字段不同记录值数量(频数统计)的写法
- SQL--处理表重复记录(查询和删除) 示例:查询最近一条用户登陆日志
- 一条sql语句,查询出全部分类各前10记录
- sql 查询id最大的数据记录
- SQL插入一条记录,马上获得ID
- SQL--处理表重复记录(查询和删除) 示例:查询最近一条用户登陆日志
- 怎么启用apache的mod_log_sql模块将所有的访问信息直接记录在mysql中
- 在sql查询中使用表变量实现上一条下一条记录
- 假设对testid有更新则插入一条新记录,那么怎么查询出testid最后的状态(分组查询)
- sql指定排序规则、筛选id最大或最小记录、查询插入数据
- sql 查询相同记录下日期最大的 一条