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