查询为两个唯一字段中的每一个选择具有特定ID的行&计算第三场的位置

时间:2014-04-16 15:57:03

标签: php mysql

我的相关表结构是这样的(id是主键并具有自动增量):

id | pid | type | distance | pspeed

每个pid(玩家ID)每个typepspeed组合都有一个唯一的行。例如,没有具有特定pid值,特定type值和多个pspeed值的行。同样地,对于pidpspeed,不会有多个行具有相同的type值。

我的目标是,对于每个type(总共26个),按pspeed分组(有7个不同的pspeed值)并按距离递减排序,直到找到特定的pid值为止使用" rank"返回该行或"位置"那一行。基本上我想为每个ORDER BY distancetype执行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;
                }
            }
        }
    }
}

some sample data

1 个答案:

答案 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

请参阅Sqlfiddle example