Plus précisément, j'essaie de classer une table en fonction d'une valeur de colonne, appelée ici power
, puis de prendre cette table classée et de trouver une ligne spécifique, ou un utilisateur dans ce cas . Un peu comme ce qui serait fait dans un classement de jeu vidéo pour trouver le classement d'un utilisateur spécifique.
En gros, j'aimerais trouver une ligne spécifique dans un tableau qui a été ordonnée. Je sais comment faire les deux, mais pas ensemble.
Je suppose que ce que j'essaie de faire est de combiner ces déclarations:
Tri:
+-----------+------+ | discordID | rank | +-----------+------+ | 123456789 | 52 | +-----------+------+
3 Réponses :
Vous semblez rechercher une fonction de fenêtre telle que RANK()
:
SELECT * FROM (SELECT u.*, RANK() OVER(ORDER BY power DESC) rnk FROM users u) x WHERE discordID = ?
La requête interne attribue un rang à chaque utilisateur, l'utilisateur ayant la puissance
la plus élevée classée en premier. Ensuite, la requête externe filtre l'utilisateur qui a le discordID
pertinent .
Il existe d'autres fonctions de fenêtre qui peuvent répondre à votre cas d'utilisation:
ROW_NUMBER ()
: attribue un rang à chaque enregistrement; les enregistrements pairs ne sont pas traités de manière cohérente
RANK ()
: les enregistrements pairs ont le même rang; si deux utilisateurs ont le rang 1, alors l'utilisateur suivant a le rang 3
DENSE_RANK ()
: identique à RANK ()
, mais ne crée pas de lacunes dans les rangs
Rejoignez les tables, puis classez.
sélectionnez discordid, RANK () OVER
(PARTITION BY u.userid ORDER BY (la colonne à partir de laquelle vous vous classez) DESC) AS Rank from otherqueryresult as q internal join user as u on u.id = q.userid
Vous pouvez faire le calcul directement.
Je pense que vous voulez:
select 1 + count(*) from users u where u.power > (select u2.power from users u2 where u2.discordID = ?);
Vous n'avez pas réellement besoin de fonctions de fenêtre pour cela. Avec des index sur (discordId, power)
et (power)
, cela devrait avoir de très très bonnes performances.
Pouvez-vous donner les noms des colonnes car pour atteindre votre objectif, vous devez faire une jointure