sql查询结果进行多sql 两个字段排序的排序

查看: 15602|回复: 11
如何用SQL语句获取某个已排序结果集的第一条记录?
论坛徽章:6
如何用SQL语句获取某个已排序结果集的第一条记录?用“select * from mytab where rownum&2 order by ctime”这条语句行吗?
论坛徽章:11
select * from (select a.*,rownum rn&&from bk_cms_file a order by a.file_id desc) where rn=1
论坛徽章:14
本帖最后由 ziling2011 于
10:26 编辑
likgui 发表于
select * from (select a.*,rownum rn&&from bk_cms_file a order by a.file_id desc) where rn= ...
这个不一定对,除非order by 排序字段是主键之类的,rownum跟物理地址有关,还是用row_number 比较靠谱
& create table tt(id number);
表已创建。
已用时间:&&00: 00: 00.04
& insert into tt(id)values(3);
已创建 1 行。
& insert into tt(id)values(10);
已创建 1 行。
已用时间:&&00: 00: 00.00
& insert into tt(id)values(1);
已创建 1 行。
已用时间:&&00: 00: 00.01
& insert into tt(id)values(6);
已创建 1 行。
已用时间:&&00: 00: 00.00
& insert into tt(id)values(4);
已创建 1 行。
已用时间:&&00: 00: 00.01
& select id,
& && &&&ID& && && &RN
---------- ----------
& && && &3& && && & 1
& && &&&10& && && & 2
& && && &1& && && & 3
& && && &6& && && & 4
& && && &4& && && & 5
已用时间:&&00: 00: 00.02
& select id,rownum rn
& && &&&ID& && && &RN
---------- ----------
& && && &1& && && & 3
& && && &3& && && & 1
& && && &4& && && & 5
& && && &6& && && & 4
& && &&&10& && && & 2
论坛徽章:0
这个好像用rownum必须3层嵌套才能取到正确的,要么用row_number
select * from (select a.*,rownum rn from (select *&&from bk_cms_file a order by file_id desc) a) t where t.rn=1
论坛徽章:6
RE: 如何用SQL语句获取某个已排序结果集的第一条记录?
likgui 发表于
select * from (select a.*,rownum rn&&from bk_cms_file a order by a.file_id desc) where rn= ...
TO likgui:您给的这条语句的执行结果只是随机给出已排序查询结果集合中的一条记录,而不是字段file_id值最大的那条记录,而我需要的恰恰是那条记录!麻烦您再讨论一下,谢谢!
论坛徽章:6
RE: 如何用SQL语句获取某个已排序结果集的第一条记录?
ziling2011 发表于
这个不一定对,除非order by 排序字段是主键之类的,rownum跟物理地址有关,还是用row_number 比较靠谱
TO ziling2011:这条语句要用在关键逻辑中,我当然希望用靠谱的办法!麻烦您给一个使用row_number的例子,谢谢!
论坛徽章:14
sanshihaoji 发表于
TO ziling2011:这条语句要用在关键逻辑中,我当然希望用靠谱的办法!麻烦您给一个使用row_number的例子, ...
&&from (select a.*, row_number() over(order by ctime) rm from mytab a)
where rm & 2
论坛徽章:51
SQL& select rownum,id from
& & ROWNUM& && && &ID
---------- ----------
& && && &2& && && &10
& && && &4& && && & 6
& && && &5& && && & 4
& && && &1& && && & 3
& && && &3& && && & 1
SQL& select * from (select * from tt order by id desc ) a where rownum&2;
& && &&&ID
----------
& && &&&10
论坛徽章:14
不好意思,我有点搞混了,2楼的是对的,我的方法更扩展性好些,可以查第几条数据
论坛徽章:3
likgui 发表于
select * from (select a.*,rownum rn&&from bk_cms_file a order by a.file_id desc) where rn= ...
itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有    
 北京市公安局海淀分局网监中心备案编号:10 广播电视节目制作经营许可证:编号(京)字第1149号PHP+MySQL数据库教程 列表
相关参考课程MySQL Order By 查询结果排序ORDER BY
SQL 语法中 ORDER BY 关键字用于对查询结果进行排序。
排序分为升序(ASC)和降序(DESC)两种,当不使用 ORDER BY 指定排序方式时,默认为升序。
SELECT column,… FROM tb_name ORDER BY column1,column2,… DESC(ASC)
ORDER BY 后面必须列出排序的字段名,可以是多个字段。
对 user 表 uid 进行降序查询:
SELECT uid,username FROM user ORDER BY uid DESC
查询结果如下:
SELECT username FROM user ORDER BY regdate DESC LIMIT 10
该例子查询出最新注册的 10 名用户的用户名。
本章节内容共分 5 部分:1.
MySQL Order By 查询结果排序4.
<(我爱开发网) — 提供最好的 、、、 及2446人阅读
数据库(148)
&&& 谈到搜索,一般就想起了SQL Server的FullTextSearch(全文搜索)功能,它确实强大,但使用起来也要做一些较为繁琐的准备工作,一般小型的项目或者对搜索要求(包括性能需求)不是很高的情况下实用它还是有点太重型了。简单的搜索用SQL查询即可,但一般面临的一个问题就是如何对搜索结果按匹配字段进行优先级排序。
&&& 例如有个产品表(Products),它的字段包:括产品ID、产品名称、产品类别、产品品牌、产品简介、产品详细介绍。
CategoryName
ProdDescription
& 现在我们要求通过某个关键字从Products表中搜索包含该关键字的记录,凡是以下任何一个字段包含该关键字的记录都列出来:ProdName, CategoryName , ProdBrand, ProdIntro, ProdDescription。 并且搜索结果按照前述字段的匹配优先级进行排序:
& 1)先列出字段ProdName匹配关键字的记录,然后列出字段CategoryName匹配关键字的记录,依此类推,最后列出字段ProdDescription匹配关键字的记录;
& 2)在字段ProdName匹配关键字的所有记录中,先列出字段CategoryName也匹配关键字的记录,然后列出字段ProdBrand也匹配关键字的记录,依次类推…
& 3)按照规则2递归排序每个记录分组……
& 搜索匹配该关键字的所有记录的SQL语句倒很简单:
SELECT&*&&
from&Products&& WHERE&ProdName&like&'%KeyWord%'&or&CategoryName&like&'%KeyWord%'&or&ProdBrand&like&'%KeyWord%'&or&ProdIntro&like&'%KeyWord%'&or&ProdDescription&like&'%KeyWord%'&&&&
& 但对搜索出的结果进行匹配优先级排序稍微有点困难。在用简单的SQL进行搜索时有两种方式来达到这个排序的目的:加权法和多字段排序法(我瞎取的名字^-^)。
一、加权法
 对搜索的每条记录计算出一个排序权&#20540;来,然后将所有搜索结果按照这个排序权&#20540;进行降序排列即可。每条被搜索出的记录的排序权&#20540;为该记录所有字段的权&#20540;之和。某个字段的权&#20540;取决于该字段是否匹配关键字,如果不匹配则为0,如果匹配则为改字段的匹配权&#20540;。字段的匹配权&#20540;计算方式为:
   fieldPriority = 2的i次冥(i为该字段在所有被搜索的字段优先级排序中倒排的位置)
 例如,在我们示例中各字段的匹配权&#20540;为:
匹配权&#20540;
CategoryName
ProdDescription
&&& 之所以采用这种算法,是为了确保某个字段匹配的记录的排序权&#20540;不会低于另外一条不匹配该字段但后续字段都匹配的记录的排序权&#20540;。例如记录A中仅仅ProdName匹配关键字,所以它的排序权&#20540;为16,而记录B中除了字段ProdName外其他字段都匹配,则其排序权&#20540;为15(8&#43;4&#43;2&#43;1=15)。但记录A仍然会排在记录B前面。
&& 相应的SQL大致如下:&
SELECT&*, (&&
&&&&&&&&&&&&&&&&&&&&&(case&when&charIndex(ProdName,KeyWord)&-1&then&16&else&0&end)&&#43;&&
&&&&&&&&&&&&&&&&&&&&&(case&when&charIndex(CategoryName,KeyWord)&-1&then&8&else&0&end)&&#43;&&
&&&&&&&&&&&&&&&&&&&&&(case&when&charIndex(ProdBrand,KeyWord)&-1&then&4&else&0&end)&&#43;&&
&&&&&&&&&&&&&&&&&&&&&(case&when&charIndex(ProdIntro,KeyWord)&-1&then&2&else&0&end)&&#43;&&
&&&&&&&&&&&&&&&&&&&&&(case&when&charIndex(ProdDescription,KeyWord)&-1&then&1&else&0&end)&&
&&&&&&&&&&&&&&&&&&)&&as&OrderPriority&&
from&Products&& WHERE&ProdName&like&‘%KeyWord%' or&
&&&&&&&&&&&&CategoryName&like&‘%KeyWord%' or&&
&&&&&&&&&&&&ProdBrand&like&‘%KeyWord%' or&
&&&&&&&&&&&&ProdIntro&like&‘%KeyWord%' or&&
&&&&&&&&&&&&ProdDescription&like&‘%KeyWord%'&&
Order&by&OrderPriority&desc&&
二、多字段排序法
&&&& 加权法实在是有点啰嗦,倒不如直接利用SQL可以对多个字段进行排序来实现更清晰更直接。实际上我们把每个字段是否匹配的权&#20540;分散到SQL的Order里即可,大致SQL如下:
SELECT&*&&
from&Products&& WHERE&ProdName&like&‘%KeyWord%' or&
&&&&&&&&&&&&CategoryName&like&‘%KeyWord%' or&&
&&&&&&&&&&&&ProdBrand&like&‘%KeyWord%' or&
&&&&&&&&&&&&ProdIntro&like&‘%KeyWord%' or&&
&&&&&&&&&&&&ProdDescription&like&‘%KeyWord%'&&
Order&by&&&&&&&&(case&when&charIndex(ProdName,KeyWord)&-1&then&0&else&1&end),&&
&&&&&&&&&&&&&&&&&&&&&(case&when&charIndex(CategoryName,KeyWord)&-1&then&0&else&1&end),&&
&&&&&&&&&&&&&&&&&&&&&(case&when&charIndex(ProdBrand,KeyWord)&-1&then&0&else&1&end),&&
&&&&&&&&&&&&&&&&&&&&&(case&when&charIndex(ProdIntro,KeyWord)&-1&then&0&else&1&end),&&
&&&&&&&&&&&&&&&&&&&&&(case&when&charIndex(ProdDescription,KeyWord)&-1&then&0&else&1&end)&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1703649次
积分:24470
积分:24470
排名:第259名
原创:1077篇
转载:216篇
评论:66条
(1)(4)(2)(1)(1)(1)(1)(3)(3)(2)(1)(1)(2)(6)(4)(2)(1)(10)(5)(2)(4)(9)(6)(8)(10)(7)(10)(9)(26)(13)(10)(4)(8)(21)(7)(5)(8)(7)(4)(7)(5)(20)(22)(11)(21)(46)(43)(16)(7)(5)(10)(21)(94)(95)(56)(107)(64)(5)(10)(17)(25)(48)(10)(5)(5)(2)(24)(18)(30)(5)(57)(120)(20)(13)15:07 提问
查询SQL数据库 使用多条where语句 的到的结果排序以某一条语句优先
查询SQL数据库 使用多条where语句 的到的结果排序以某一条语句优先 想请教一下如何做到?求一个例子啊。,。
select * from student where class = 1 and(namelike edittext or namePY(姓名每个字拼音) like edittext ) 就比如是这样一条语句,写的很不标准见谅 搜索学生列表 在第一班级里面搜索 如果输入wan 这时候搜索出来的结果可能是 一个叫万某某的同学或者名字里含有某(Wan)字的同学 和一个叫王安楠的同学或者某(W)某(A)某(N) 然我结果我想把符合第二个 也是就是拼音打头的条件的同学在前面优先排序,这里要如何解决呢?
按赞数排序
没太明白,可以再表达清楚一点
你没表达清楚,不知道知道你的意途
select *from students where class=1 and name = wan%s,是这样吗?
select *from students where class=1 and name like wan%s,是这样吗?
你可以把这两个命令分开,插入一个排序ID,再用Union连接起来排序的:
select a.* from (
select * ,'1' as SortID from student where class = 1 and name like edittext
select * ,'2' as SortID from student where class = 1 and namePY like edittext) a
order by SortID
其他相关推荐
其他相似问题君,已阅读到文档的结尾了呢~~
广告剩余8秒
文档加载中
计算机5套试题(可编辑),计算机一级考试试题,计算机二级考试试题,计算机网络试题,计算机试题,计算机应用基础试题,职称计算机试题,计算机网络笔试题,计算机统考试题,计算机基础试题
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
计算机5套试题(可编辑)
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口

我要回帖

更多关于 sql 多个字段排序 的文章

 

随机推荐