Comment récupérer les lignes de la colonne avec la valeur la plus élevée à l'aide de SQL [dupliquer]
P粉211273535
P粉211273535 2023-09-20 13:44:50
0
2
577

J'ai un tableau des documents (voici une version simplifiée) :

id Redirection Contenu
1 1 ...
2 1 ...
1 2 ...
1 3 ...

Comment sélectionner une ligne pour chaque identifiant et sélectionner uniquement le rev le plus grand ?

Sur la base des données ci-dessus, le résultat devrait contenir deux lignes :[1, 3, ...][2, 1, ..]. J'utiliseMySQL.

Actuellement, j'utilise une vérification dans unewhileboucle pour détecter et écraser les anciennes versions dans l'ensemble de résultats. Mais est-ce la seule façon d’obtenir des résultats ? N'y a-t-il pas de solutionSQL?

P粉211273535
P粉211273535

répondre à tous (2)
P粉714780768

Je préfère utiliser le moins de code possible...

Vous pouvez utiliserINpour réaliser Essayez ceci :

SELECT * FROM t1 WHERE (id,rev) IN ( SELECT id, MAX(rev) FROM t1 GROUP BY id )

À mon avis, c'est plus simple... plus facile à lire et à maintenir.

    P粉336536706

    À première vue...

    Vous avez juste besoin de laGROUP BY子句中使用MAXfonction d'agrégation :

    SELECT id, MAX(rev) FROM YourTable GROUP BY id

    Les choses ne sont jamais aussi simples, n'est-ce pas ?

    Je viens de remarquer qu'il faut aussicontentcolonnes.

    En SQL, il s'agit d'un problème très courant : rechercher la ligne entière de données avec la valeur maximale dans une certaine colonne en fonction d'un certain identifiant de regroupement. J'ai beaucoup entendu cette question au cours de ma carrière. En fait, c'est une question à laquelle j'ai répondu lors d'un entretien technique pour mon emploi actuel.

    Cette question est en fait si courante que la communauté Stack Overflow a créé une balise spécifiquement pour traiter ce type de question :.

    En gros, vous avez deux manières de résoudre ce problème :

    Rejoignez-nous en utilisant une simplegroup-identifier, max-value-in-groupsous-requête

    Dans cette approche, vous trouvez d'abordgroup-identifier, max-value-in-group(已经在上面解决了)。然后,你将你的表与子查询进行连接,使用group-identifiermax-value-in-groupdans une sous-requête (déjà résolue ci-dessus). Vous joignez ensuite votre table avec la sous-requête, en utilisant

    et max-value-in-grouppour une équijointure :

    SELECT a.id, a.rev, a.contents FROM YourTable a INNER JOIN ( SELECT id, MAX(rev) rev FROM YourTable GROUP BY id ) b ON a.id = b.id AND a.rev = b.rev

    Utilisez l'auto-jointure pour la jointure gauche et ajustez les conditions de connexion et les conditions de filtrage

    group-identifierDans cette approche, vous effectuez une jointure gauche de la table avec elle-même. Les équijointures sont placées dans

    . Ensuite, il y a deux étapes astucieuses :
    1. La deuxième condition de connexion est que la valeur de gauche est inférieure à la valeur de droite
    2. NULL(记住这是一个LEFT JOIN)。然后,我们过滤连接的结果,只显示右侧为NULLLorsque vous effectuez l'étape 1, la ligne qui a réellement la plus grande valeur sera la ligne avec
    3. à droite.

    Donc, vous vous retrouvez avec :

    SELECT a.* FROM YourTable a LEFT OUTER JOIN YourTable b ON a.id = b.id AND a.rev < b.rev WHERE b.id IS NULL;

    Conclusion

    Les deux méthodes vous donneront exactement les mêmes résultats.

    group-identifier中有两行具有max-value-in-groupS'il y a deux lignes avecmax-value-in-groupdans

    , alors ces deux lignes apparaîtront dans le résultat dans les deux méthodes.

    Les deux méthodes sont compatibles SQL ANSI, donc quelle que soit la « saveur » du SGBDR que vous préférez, vous pouvez l'utiliser.

    Les deux méthodes sont également respectueuses des performances, mais votre situation réelle peut être différente (SGBDR, structure de base de données, index, etc.). Ainsi, lorsque vous choisissez une méthode, effectuez unbenchmarking

    . Assurez-vous de choisir la méthode qui vous convient le mieux.
      Derniers téléchargements
      Plus>
      effets Web
      Code source du site Web
      Matériel du site Web
      Modèle frontal
      À propos de nous Clause de non-responsabilité Sitemap
      Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!