Je souhaite trouver la position d'un utilisateur dans un classement et renvoyer les 4 utilisateurs ci-dessus et 4 utilisateurs sous leur position.
Ma table, "prédictions", ressemble à ceci: p>
SELECT * FROM ( SELECT l.userId, l.rank, l.score, l.createdAt, @curRow := @curRow + 1 AS row_number FROM (SELECT * FROM `predictions` WHERE gameId = 18) l JOIN (SELECT @curRow := 0) r ORDER BY rank ASC) generated_ordered_table WHERE row_number < (SELECT row_number FROM generated_ordered_table WHERE userId = 1) ORDER BY row_number DESC LIMIT 0,5
3 Réponses :
MySQL Version 8+ aurait pu autoriser l'utilisation de fenêtre Noreferrer"> Fonctions et Expressions de table communes (CTES) A >; qui aurait simplifié la requête assez un peu. Maintenant, dans les anciennes versions (votre cas), la "Table de rang générée" ( Table dérivée ) ne peut plus être référencé dans une sous-requête à l'intérieur du Donc, une autre approche peut être utiliser Tables temporaires . Nous créons une table Temp stockant d'abord les rangs. Et, alors faites référence à la table Temp pour obtenir des résultats en conséquence: P> où code> clause. Une solution serait de faire la même chose deux fois (
Sélectionnez la clause CODE> pour obtenir une table générée) à nouveau à l'intérieur de la sous-requête, mais cela serait relativement inefficace. P>
SELECT *
FROM gen_rank_tbl
WHERE row_number < (SELECT row_number FROM gen_rank_tbl WHERE userId = 1)
ORDER BY row_number DESC
LIMIT 0,5
Vous pouvez utiliser un tas de syndicats mais ce n'est pas joli p> p> p>
Vous pouvez utiliser deux tables dérivées:
quelle version de mysql utilisez-vous
mysqlnd 5.0.12-Dev
Pouvez-vous ajouter votre résultat attendu s'il vous plaît. Et une clarification d'environ 4 ci-dessous (correspond-elle 4 ou 4 la plus proche ou 4 la plus éloignée) pour 4 ci-dessus.