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.