Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment écrire le plus grand n par requête de type groupe, mais avec des conditions supplémentaires ?

Cela nécessite une certaine attention à l'endroit où placer la condition (à where ou pour on ?) pour ne pas vous faire avoir :-) Vous devez ajouter la condition pour t1 à where clause et pour t2 à on clause :

SELECT t1.type, t1.name, t1.value
FROM mytable t1
LEFT JOIN mytable t2 ON t1.type = t2.type AND t1.value > t2.value 
    AND t2.popularity > 3 /* here */
WHERE t2.value IS NULL 
    AND t1.popularity > 3 /* and here */

Je ne l'ai pas testé, mais cela devrait fonctionner.

Tentative d'explication : la condition dans la clause where affecte les éléments que vous considérez comme des éléments potentiels avec la valeur la plus faible. Alors que la condition dans on clause affecte le lien :à quels autres éléments voulez-vous la comparer ? Il définit le groupe au sein duquel vous comparez. Techniquement, cela a un impact sur le moment où t2.* sera NULL. Aviez-vous donné la condition sur t2.popularity à where à la place, vous ne recevrez aucun NULL (c'est-à-dire que vous ne trouverez pas d'éléments avec la valeur la plus basse) pour les groupes où les éléments les plus bas ont une faible popularité.