SQL Select подсчитать несколько столбцов и отсортировать

0

Поэтому я стараюсь сортировать от самых высоких престижей, а затем самый высокий опыт (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.

Например, если кто-то имеет престиж 1 и 3 000 000 опыта, а затем кто-то является престижем 0 и 4 000 000 опыта, они достигают того же ранжирования, поскольку второй человек должен быть ранг 2.

Я пытаюсь выполнить ORDER BY, но, похоже, он не работает. Я не слишком опытен с SQL-запросами, если у вас есть какие-либо указатели или я могу помочь мне, это было бы здорово.

  • 0
    В качестве примечания, я бы предложил вам получить престиж и рейтинг опыта обоих «рангов», а затем определить, какой реальный рейтинг основан на этих 2
  • 0
    Хорошо, я думаю, что это решение работает. У меня нет ничего, чтобы проверить это, но должен дать желаемые результаты
Теги:

1 ответ

0

Если престиж является основным атрибутом ранжирования:

$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, но это должно облегчить понимание

  • 0
    Этот запрос не работает. Я попробовал это только сейчас, и это не сортирует, как это предполагается. Основным должен быть престиж, а затем опыт. Вроде как ORDER BY DESC работает.
  • 0
    Там логика для этого, просто введите идентификатор в ваших таблицах и работать оттуда
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню