簡體   English   中英

查詢以為兩個唯一字段中的每個字段選擇具有特定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

每個pid (玩家ID)都有每種typepspeed組合的唯一行。 例如,沒有行具有特定的pid值,特定的type值和多個pspeed值。 同樣,對於pidpspeed ,具有相同type值的行不超過一列。

我的目標是,對於每種type (總共26種),按pspeed分組(有7個不同的pspeed值),然后按距離遞減的順序進行排序,直到找到特定的pid值,然后以“ rank”或“ position”返回該行”。 基本上,我想對每種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的所有組合,然后將具有相同類型和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示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM