我的相关表结构如下(id
是主键,具有自动增量):
id | pid | type | distance | pspeed
每个CCD_ 2(玩家id)对于每个type
和pspeed
组合具有唯一的行。例如,不存在具有特定pid
值、特定type
值和多个pspeed
值的行。同样,对于pid
和pspeed
,具有相同type
值的行不超过一行。
我的目标是,对于每个type
(共有26个),按pspeed分组(有7个不同的pspeed值),并按距离降序排序,直到找到特定的pid
值,并返回该行的"秩"或"位置"。基本上,我想为每个type
和pspeed
做一个ORDER BY distance
,直到达到特定的pid
值。
这可以通过纯查询实现吗?我知道如何在PHP脚本中使用几个查询和循环来实现这一点,但我希望能够最大限度地减少我必须编写的代码。不幸的是,我非常肯定这将需要超出我能力范围的SQL知识
如果计数到特定的pid
值是不可能的,我可以将其烘焙到我的PHP脚本中以确定"秩"。
编辑:以下是我目前的做法(使用CodeIgniter):
$res = array();
$q1 = $this->db1->get_where('uq_players', array('authid' => $authid), 1);
if($q1->num_rows()){
foreach($this->jtype as $type => $value){
foreach($this->pspeed as $speed){
$i = 0;
$this->db1->order_by('distance', 'desc');
$q2 = $this->db1->get_where('uq_jumps', array('type' => $type, 'pspeed' => $speed));
foreach($q2->result() as $row){
$i += 1;
if($row->pid === $q1->row()->id){
$res[] = self::create_array($row, $type, $row->wpn, $i);
break;
}
}
}
}
}
以及一些样本数据。
您可以首先尝试获取给定玩家的所有不同分数以及类型和pspeed的所有组合的行集,然后左键连接具有相同类型和psfeed但距离更大的所有其他分数。如果你的玩家在这个组合中排名第一,你将获得一行零,否则你将获得等于距离更远的玩家数量的行数,增加后将获得玩家排名。
SELECT t1.type, t1.pspeed, 1+SUM(t2.pid IS NOT NULL) as rank
FROM scores t1
LEFT JOIN scores t2
ON t1.type = t2.type AND t1.pspeed = t2.pspeed AND t1.distance < t2.distance
WHERE t1.pid = 1
GROUP BY t1.type, t1.pspeed
请参见Sqlfiddle示例。