Detta kräver viss uppmärksamhet var villkoret ska placeras (till where
eller till on
?) så att du inte blir lurad :-) Du måste lägga till villkoret för t1 till where
sats och för t2 till on
klausul:
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 */
Har inte testat det, men det borde fungera.
Försök att få en förklaring: villkoret i where-satsen påverkar vilka element du betraktar som potentiella element med lägst värde. Medan villkoret i on
klausulen påverkar kopplingen:med vilka andra element vill du jämföra den? Den definierar gruppen inom vilken du jämför. Tekniskt sett har det en inverkan på när t2.* blir NULL. Hade du gett villkoret på t2.popularity till where
i stället skulle du inte få några NULLs (dvs. inte hitta element med lägsta värde) för grupper där de lägsta elementen har låg popularitet.