我的相关表结构是这样的(id
是主键并具有自动增量):
id | pid | type | distance | pspeed
每个pid
(玩家ID)每个type
和pspeed
组合都有一个唯一的行。例如,没有具有特定pid
值,特定type
值和多个pspeed
值的行。同样地,对于pid
和pspeed
,不会有多个行具有相同的type
值。
我的目标是,对于每个type
(总共26个),按pspeed分组(有7个不同的pspeed值)并按距离递减排序,直到找到特定的pid
值为止使用" rank"返回该行或"位置"那一行。基本上我想为每个ORDER BY distance
和type
执行pspeed
,直到达到特定的pid
值。
这可以通过纯查询吗?我知道如何在PHP脚本中使用多个查询和循环来执行此操作,但我希望能够最小化我必须编写的代码。不幸的是,我非常肯定它需要超出我的SQL知识。
如果无法计算直到特定的pid
值,我可以将其烘焙到我的PHP脚本中以确定" rank"。
编辑:这是我目前正在做的事情(使用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;
}
}
}
}
}
答案 0 :(得分:1)
您可以先尝试为给定的玩家设置所有不同分数的行集以及所有类型和pspeed的组合,然后将所有其他分数与相同的类型和pspeed但更大的距离连接起来。如果你的玩家在这个组合中排名第一,你将得到一行有空值,否则你将得到的行数等于距离更远的玩家数量,增加后会给你玩家等级。
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