1
votes

sql - Existe-t-il un moyen de filtrer les résultats d'une requête SELECT, avec une autre requête SELECT?

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  |
+-----------+------+


1 commentaires

Pouvez-vous donner les noms des colonnes car pour atteindre votre objectif, vous devez faire une jointure


3 Réponses :


3
votes

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


0 commentaires

2
votes

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


0 commentaires

0
votes

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.


0 commentaires