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é.