mysql除了最新版8 实现了开窗函数可以直接实现,低版本的排名是比较复杂的,但是可以利用自定义变量实现。具体很难讲清楚,我给你举个例子吧。
成都创新互联专注于鄞州网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供鄞州营销型网站建设,鄞州网站制作、鄞州网页设计、鄞州网站官网定制、微信小程序定制开发服务,打造鄞州网络公司原创品牌,更为您提供鄞州网站排名全网营销落地服务。
set @rank:=0;
select *,@rank:=@rank+1 from (select topid,count(*) as cnt from tc_vote group by topid) tv order by cnt
MYSQL的降序排列
今天查询时需要用到降序排列,老是出错,仔细检查SQL语法也没问题,
后来才知道,原来order by要放在limit的前面。或者说limit要放在最后。
[sql]
String sql = "select * from s_dayreport " +
"where userId = "+userId+" " +
"order by taskDate desc " +
"limit "+firstResult+","+maxResults+" "降序排列的例子,插入的数据无关,关键是你打印出或者展现出的效果
具体查询如下:
SELECT*
FROM tableNameWHERE id IN(179906362505 , 63323849672846 , 1842319481513 , 11931471166161 , 926221118 , 124571 , 55434 , 9297877807)
查询的结果和in中的顺序并不一致,也就是说在批量查询时,mysql的查询并不是按照in中的值得顺序来查询的。那怎么才能保证和in查询中的顺序相同呢?
查询了资料发现有两种方式可以对in查询的结果进行排序。一种是order by find_in_set,另外一种是order by substring_index
可以通过用该字段分组计数获得。例如:
select col1,count(col1) as cnt
from t1 group by col1;
这个查询可返回表t1的字段col1中每个值的重复次数。
select id,integral,addtime from cos_member_vip order by integral desc,addtime asc
--如果需要生成以积分为最高优先,其次以时间为从高到低为条件生成个排名字段,可用
--ROW_NUMBER() OVER ()函数
这个如果想要性能的话,就用下面的sql语句实现:
select orderNo from (select (@rowNum:=@rowNum+1) orderNo , userid ,pid from TABLE,(Select (@rowNum :=0) ) b )t where t.userid=2694
然后php获得这条结果数组,取第一个元素即是排序
如果对这个sql语句有疑问,不明白,可以使用一个比较耗费性能的方法:
select userid from record
执行这条语句,获得一个数组$res
遍历前设置一个记录排序的标识 $seq=1;
for(...){
$userid=$res['userid'];//把第seq 个位置的学号拿出来,跟想要的学号比
if($userid==2694){
break;
}
$seq++;
}
//如果 这个排序标识比结果集数组大小还大,说明没这个userid的记录。
$seq就是排序
我没有测试 你可以自己试一下