Requête SQL pour sélectionner uniquement les lignes avec la valeur maximale
P粉752479467
2023-08-22 10:03:28
<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>
Je préfère utiliser le moins de code possible...
Vous pouvez utiliser
IN
pour réaliser Essayez ceci :À mon avis, c'est plus simple... plus facile à lire et à maintenir.
À première vue...
Vous avez juste besoin de la
GROUP BY
子句中使用MAX
fonction d'agrégation :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 : trouver les données complètes correspondant à 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, j'ai répondu à l'une de ces questions 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 : greatest-n-per-group.
En gros, vous avez deux manières de résoudre ce problème :
Rejoignez-nous en utilisant une simple
group-identifier, max-value-in-group
sous-requêteDans cette approche, vous trouvez d'abord
etgroup-identifier, max-value-in-group
(已经在上面解决了)。然后,你将你的表与子查询进行连接,使用group-identifier
和max-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 utilisantmax-value-in-group
pour une équijointure :group-identifier
Dans cette approche, vous effectuez une jointure gauche de la table avec elle-même. Equijoinez-vous surNULL
(记住这是一个LEFT JOIN
)。然后,我们过滤连接结果,只显示右侧为NULL
Lorsque vous effectuez l'étape 1, la ligne qui a réellement la plus grande valeur sera la ligne avecgroup-identifier
和max-value-in-group
Si vous avez deux lignes avec les mêmesmax-value-in-group
, les deux méthodes incluront les deux lignes dans le résultat.Les deux méthodes sont très efficaces, mais les résultats spécifiques peuvent varier (SGBDR, structure de la 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. 🎜