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


Query To Select Row With Specific ID For Each Of Two Unique Fields & Count Position Of Third Field

我的相关表结构如下(id是主键,具有自动增量):

id | pid | type | distance | pspeed

每个CCD_ 2(玩家id)对于每个typepspeed组合具有唯一的行。例如,不存在具有特定pid值、特定type值和多个pspeed值的行。同样,对于pidpspeed,具有相同type值的行不超过一行。

我的目标是,对于每个type(共有26个),按pspeed分组(有7个不同的pspeed值),并按距离降序排序,直到找到特定的pid值,并返回该行的"秩"或"位置"。基本上,我想为每个typepspeed做一个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示例。