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