Requête SQL pour sélectionner uniquement les lignes avec la valeur de colonne maximale
P粉662614213
P粉662614213 2023-08-21 14:17:15
0
2
362
<p>J'ai un tableau de documents (voici une version simplifiée) : </p> <table class="s-table"> <tête> <tr> <th>id</th> <th>rév</th> <th>contenu</th> ≪/tr> ≪/tête> <corps> <tr> <td>1</td> <td>1</td> <td>...</td> ≪/tr> <tr> <td>2</td> <td>1</td> <td>...</td> ≪/tr> <tr> <td>1</td> <td>2</td> <td>...</td> ≪/tr> <tr> <td>1</td> <td>3</td> <td>...</td> ≪/tr> </tcorps> </tableau> <p>Comment sélectionner une ligne par identifiant et sélectionner uniquement le rev le plus grand ? </p><p> Sur la base des données ci-dessus, le résultat doit contenir deux lignes : <code>[1, 3, ...]</code> et <code>[2, ​​​​​​1, ..]</code> ;. J'utilise <strong><em>MySQL</em></strong>. </p> <p>Actuellement, j'utilise une vérification dans une boucle <code>while</code> pour détecter et écraser les anciennes versions dans le jeu de résultats. Mais est-ce la seule façon d’obtenir des résultats ? N'existe-t-il pas une solution pour <strong>SQL</strong> ? </p>
P粉662614213
P粉662614213

répondre à tous(2)
P粉909476457

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

Vous pouvez utiliser IN pour 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粉287345251

À première vue...

Il vous suffit d'utiliser la clause avec MAX聚合函数的GROUP BY : 

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 aussi content colonnes.

Il s'agit d'un problème très courant en SQL : rechercher la ligne entière de données avec la valeur maximale dans une 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 l'une des questions auxquelles j'ai répondu lors d'un entretien technique à 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 simple group-identifier, max-value-in-groupsous-requête

Dans cette approche, vous trouvez d'abord group-identifier, max-value-in-group(已经在上面解决了)。然后,你将你的表与子查询进行连接,使用group-identifiermax-value-in-group dans 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-group pour 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-connexion 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. L'équijointure est effectuée le

. 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 aura la ligne
  3. à droite.

Vous vous retrouvez donc 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 résultats obtenus par ces deux méthodes sont exactement les mêmes.

group-identifier有两行具有max-value-in-groupS'il y a deux lignes avec max-value-in-group pour

, les deux méthodes incluront les deux lignes dans le résultat.

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.). Alors lorsque vous choisissez l'une de ces méthodes, faites du benchmark

. Et 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!