数据库中某项其中一个值在该项排第几,php+mysql

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库中某项其中一个值在该项排第几,php+mysql相关的知识,希望对你有一定的参考价值。

想做一个打卡次数排名的程序,现在有一个表,内容如下:

xuehao cishu
100 1
103 21
112 6
126 10
……
然后需要得出某一个xuehao下的值对应的cishu,在整个表里cishu排第几
比如说 我想知道xuehao为112的人他打卡次数是6次,那么按照次数排序,是排第几
环境是php+mysql
求php实现代码,谢谢,可以再加分

这个如果想要性能的话,就用下面的sql语句实现:
select orderNo from (select (@rowNum:=@rowNum+1) orderNo , xuehao,cishu from record,(Select (@rowNum :=0) ) b
order by cishu desc)t where t.xuehao=112
然后php获得这条结果数组,取第一个元素即是排序

如果对这个sql语句有疑问,不明白,可以使用一个比较耗费性能的方法:
select xuehao,cishu from record order by cishu desc
执行这条语句,获得一个数组$res
遍历前设置一个记录排序的标识 $seq=1;
for(...)
$xuehao=$res['xuehao'];//把第seq 个位置的学号拿出来,跟想要的学号比
if($xuehao==112)
break;

$seq++;

//如果 这个排序标识比结果集数组大小还大,说明没这个学号的记录,否则,就是这个学号打卡次数的排序。
$seq就是排序追问

恩,类似第一个的方法我也试过,当时看的这个http://zhidao.baidu.com/question/516888937.html问题的解决方案,也得出了排序的结果
但是现在想要知道 某一个学号的打卡次数排第几应该怎么求啊?
我之前问了一个问题http://zhidao.baidu.com/question/569980187
如果能解决 两个题目的分一起给你

追答

某一个学号的打卡次数排第几应该怎么求啊 ,你新学php?还是新学sql?上面说的很清楚了啊。
第一种方法,把所有的人打卡次数按逆序排列,组成一个结果集,然后用想要找的那个学号作为条件,从这个结果集里查找。就找到这个学号的打卡次数排序了啊。

第二种方法,更好理解,把所有的打卡次数排序全取出来,组成一个数组集合,然后从头遍历,每遍历一个,排序会+1,知道找到这个学号为止,就知道这个学号的排序了啊。

追问

我是新手
我之前问了一个问题http://zhidao.baidu.com/question/569980187

现在得到的数据是三维数组吧,那么怎么根据学号去获得排序的值呢?
难道用foreach循环吗?那几万条数据不是要很久

追答

……用第一种方法,得到的是一个只有一个元素的数组!Array([0]>5)一次性获得某个学号打卡次数排第几了!

用第二种方法,得到的是类似这样的数据Array ( [0] => Array ( [xuehao] => 20110407101 [cishu] => 87 ) [1] => Array ( [xuehao] => 20120402425 [cishu] => 86 ) ,然后遍历这个数组,看要找的学号位于数组的第几位,即为名次

追问

恩,出来了,谢谢啊
现在用第一个方法得到的数据是
Array ( [0] => Array ( [orderNo] => 152 ) )
能弄成一位数组吗?
对了你可以在http://zhidao.baidu.com/question/569980187这个问题回答,我把分一起给你

追答

Array ( [0] => Array ( [orderNo] => 152 ) )
能弄成一位数组吗?
这种格式是查询结果集的固定格式,没个结果集都是一个包含了N个数组的数组。
第一种方式因为只会查到一条结果,所以它才是一个只包含了一个数组的数组。res[0][‘orderNo’]就拿出来了。应该是这样。

追问

刚才那个一位数组的是不是不可以完成?话说有没有php函数可以完成的?
还有怎么再以第二个条件来排序呢?比如说还有一个项是time,先按照次数来排序然后再按照time时间先后来
还有如果,直接去掉重复的来排名,比如说现在打卡数据是“5、5、4、4、3、3”那么现在打卡4次的就是排名第二,这个可以实现吗?
谢谢

参考技术A select count(*) form record where cishu>(select cishu form record where xuehao=112) 这是单查学号得排行,,不知你想得结果,得列表,,注意还有次数相等的情况,有并列的

nyoj139--我排第几个 (康拓展开)

我排第几个

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描述

现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的?

输入
第一行有一个整数n(0<n<=10000);
随后有n行,每行是一个排列;
输出
输出一个整数m,占一行,m表示排列是第几位;
样例输入
3
abcdefghijkl
hgebkflacdji
gfkedhjblcia
样例输出
1
302715242
260726926
来源
[苗栋栋]原创
上传者
苗栋栋
懵B;
#include <cstdio>
#include <cstring>
int a[15];
void deal()
{
    a[1]=1; 
    for(int i=2; i<=12; i++)
        a[i]=a[i-1]*i;
}
int main()
{
    deal();
    int t;scanf("%d", &t);
    while(t--)
    {
        char str[15];
        scanf("%s", str); int len=strlen(str);
        int rec =0;
        for(int i=0; i<len; i++)
        {
            int count=0;
            for(int j=i+1; j<len; j++)
                if(str[j]<str[i]) count++;
            rec+= count*a[len-1-i];    
        } 
        printf("%d\\n", rec+1);
    } 
    return 0;
}

 

技术分享
#include <cstdio>
#include <cstring>
int jc[13]={0, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600};
int main()
{
    char normal[13]="abcdefghijkl"; 
    int t; scanf("%d", &t);
    while(t--)
    {
        int v[13]; memset(v, 0, sizeof(v));
        char str[13]; scanf("%s", str);
        int len=strlen(str); 
        int sum=0;
        
        for(int i=0; i<len; i++)
        {
            v[str[i]-a]=1;    
            if(str[i]-normal[i]==0)
            {
                continue;
            }
            else
            {
                int d=0; int p=str[i]-a;
                for(int k=p-1; k>=0; k--)
                    if(v[k]==0)
                        d++;
                int j=i+1;
                int t=12-j;
                //printf("%d\\n", j+t);
                sum=sum+d*jc[t];
            }        
        }
        printf("%d\\n", sum+1);
    }
    return 0;
}
FALIED

 

以上是关于数据库中某项其中一个值在该项排第几,php+mysql的主要内容,如果未能解决你的问题,请参考以下文章

NYOJ--139--我排第几个(康托展开)

大数据发展最快的那些省份!看看你的家乡排第几

大数据发展最快的那些省份!看看你的家乡排第几

小红和小明是一个队伍的小朋友,小红排第5,小明排第几?

2021全球最佳雇主榜:三星喜提第一 你猜华为排第几,你怎么看

最难学的七大编程语言,VB 第一,Python垫底,看你学的排第几