簡體   English   中英

SQL選擇計數多列並排序

[英]SQL Select count multiple columns and sort

因此,我嘗試從最高信譽到最高體驗(xp)進行排序

public function getRank($user, $skill, $mode) {
    $skill2 = strtolower($skill)."_xp";
    $skill3 = strtolower($skill)."_prestiges";
    $stmt = $this->conn->prepare("SELECT (
                    SELECT COUNT(*) FROM hs_users WHERE mode = :mode AND (
                        $skill3 >= u.$skill3 AND $skill2 >= u.$skill2
                    )
                ) AS rank 
                FROM hs_users u 
                WHERE username = :user AND mode = :mode2 
                LIMIT 1");

    $stmt->bindParam(":user", $user);
    $stmt->bindParam(":mode", $mode);
    $stmt->bindParam(":mode2", $mode);
    $stmt->execute();
    return $stmt->fetchColumn();
}

目前我獲得重復的排名,兩個人排名第一。

例如,如果某人的信譽為1和3,000,000,而某人的信譽為0和4,000,000,那么他們獲得的排名是相同的,而第二人稱是2。

我一直在嘗試ORDER BY,但似乎沒有用。 如果您有任何指針或者可以幫助我,那我對SQL查詢的經驗還不太豐富。

如果信譽是主要排名屬性:

$stmt =  $this->conn->prepare("SELECT id, $skill3, $skill2
              FROM hs_users
              WHERE username = :user 
                  AND mode = :mode
                  ");
$stmt->bindParam(":user",$user);
$stmt->bindParam(":mode",$mode);
if($stmt->execute()){
    $user = $stmt->fetch(PDO::FETCH_ASSOC);// get the users id, prestige and experience level
}
$higherPrestiges = array();
$stmt = $this->conn->prepare("SELECT id
                                 FROM hs_users
                                 WHERE $skill3 >= :skill3
                                     AND mode = :mode");
$stmt->bindParam(":skill3",$user[$skill3]);
$stmt->bindParam(":mode",$mode);
if($stmt->execute()){
    while($row = $stmt->fetch(PDO::FETCH_COLUMN)){ //get all users that have higher prestige
        $higherPrestiges[$row] = $row;
    }

}
if(count($higherPrestiges) > 0){
    $higherPrestiges_implode = implode(",",$higherPrestiges);
}else{
    $higherPrestiges_implode = "0";
}
$lowerExperiences = array();
$stmt = $this->conn->prepare("SELECT id 
                                 FROM hs_users
                                 WHERE $skill3 = :skill3
                                     AND $skill2 < :skill2
                                     AND mode = :mode");
$stmt->bindParam(":skill2",$user[$skill2]);
$stmt->bindParam(":skill3",$user[$skill3]);
$stmt->bindParam(":mode",$mode);
if($stmt->execute()){
    while($row = $stmt->fetch(PDO::FETCH_COLUMN)){//get users with lower experience with the same prestige
        $lowerExperiences[$row] = $row; 
    }
}

if(count($lowerExperiences) > 0){
    $lowerExperiences_implode = implode(",",$lowerExperiences);
}else{
    $lowerExperiences_implode = "0";
}

$stmt = $this->conn->prepare("SELECT COUNT(id) 
                                 FROM hs_users
                                 WHERE mode = :mode 
                                     AND id IN(".$higherPrestiges_implode.")
                                     AND id NOT IN(".$lowerExperiences_implode.")");
$stmt->bindParam(":mode",$mode);
if($stmt->execute()){
    $rank = $stmt->fetch(PDO::FETCH_COLUMN);//get number of users that have higher or equal prestige and exclude the ones with lower experience
}

只需將查詢中對“ id”的引用替換為表中主鍵的列名

我確實意識到最后3個查詢可以與IN子句中的子查詢結合使用,但這應該使它更易於理解

暫無
暫無

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

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