Toutes les lignes de retour avec la valeur “MAX” dans SQL?
J'ai le tableau suivant:
Tableau: Scores
Ce que j'ai:
+----+-------+ | Id | valeur | +----+-------+ | 1 | 300 | | 2 | 300 | | 3 | 300 | | 4 | 100 | | 5 | 200 | +----+-------+
Ce dont j'ai besoin:
+----+-------+ | Id | valeur | +----+-------+ | 1 | 300 | | 2 | 300 | | 3 | 300 | --------------
Comment aurais-je prendre "toutes" les meilleurs scores id 1, 2, 3 en SQL. J'ai commencé à l'aide de MAX (mysql), mais qui ne retourne une ligne.
Voulez-vous juste les 3 meilleurs scores?
stackoverflow.com/questions/11115044/...
Où 3 x dans [0, n) ..
stackoverflow.com/questions/11115044/...
Où 3 x dans [0, n) ..
OriginalL'auteur RidingRails | 2012-08-28
Vous devez vous connecter pour publier un commentaire.
Ravi de vous aider. Rappelez-vous à voter les réponses que vous avez trouvé utile et d'en accepter un, de sorte que cette question ne reste pas "ouvrir".
OriginalL'auteur Joe Stefanelli
Utilisation rapide de la variable:
ou encore: (et je suis normalement dans la ferme opposition de la sous-requêtes, mais c'est une évidence.
Noter que ce sont à la fois préférable à la plus de base " OÙ valeur = (sous-requête) parce que, pour chacun d'eux, la requête pour trouver la valeur MAX est exécutée exactement une fois (la garantie absolue de ce est pourquoi je préfère la variable en fonction de la solution). Avec la version sous-requête (dans le cas OÙ, pas de la JOINTURE), que la requête est susceptible d'être exécutée une fois par ligne.
J'ai fait un peu de requête d'analyser avec
EXPLAIN EXTENDED
, et la JOINTURE INTERNE méthode est probablement la plus succincte et optimale de toutes les suggestions (en supposant que vous êtes dans un environnement où l'utilisation de MySQL variables est trop lourd; je pense toujours que c'est le plus propre).performance:
Depuis une intéressante discussion a eu lieu, j'ai décidé de vraiment creuser et d'évaluer ces choses (overkill, je sais, mais amusant et de connaissances utiles sur les questions plus importantes). Il y a un peu d'une analyse astuce pour la détection complète les analyses de la table; l'ajout de
WHERE (@foo := @foo + 1)
à la sous-requêtes en question, puis en définissant @foo à 0, l'exécution de la requête, et de voir ce que @foo est. C'est pas la fin-tous-les requêtes-toll, le système métrique, mais il peut être très instructif sur la façon dont souvent vous demander de MySQL pour évaluer chaque ligne. Voici les "scores" avec votre échantillon de données (en bas c'est mieux):value
dans votre sous-requête pour l'USING
à opérer.Merci, n'hésitez pas à modifier les réponses sur la. 🙂
OriginalL'auteur Chris Trahey
Dans MySQL, vous devez faire ceci avec une jointure ou une sous-requête:
OriginalL'auteur Gordon Linoff
Utiliser cette requête:
Documentation: Les sous-requêtes avec TOUS les
L'Optimisation Des Sous-Requêtes:
J'ai réalisé que. J'ai mis à jour ma réponse.
Pourquoi le downvote?
Ce sera la cause d'une magnitude de comparaisons de se produire lorsqu'un seul (par ligne) est nécessaire. Voir ci-dessus +1 réponses pour une légère modification très importante d'exécution optimisé (comparaison pour l'égalité une fois pour MAX() au lieu de les inégalités pour chaque), un sens?
Alors, aidez-moi à comprendre (j'ai toujours envie d'apprendre). Quand je lok à l'extension de la puissance de vos requêtes
EXPLAIN EXTENDED
, je vois encore une sous-requête (c'est post-optimizer, btw). Quand je fais la même chose avec ma JOINTURE version, je vois une comparaison d'égalité à une valeur statique (300 avec les OP des données de l'échantillon).OriginalL'auteur Jocelyn