Esto requiere algo de atención donde poner la condición (a where
o para on
?) para que no te engañen :-) Debes agregar la condición para t1 a where
cláusula y para t2 a on
cláusula:
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 */
No lo he probado, pero debería funcionar.
Intento de explicación: la condición en la cláusula where afecta qué elementos considera como elementos potenciales con el valor más bajo. Mientras que la condición en on
cláusula afecta el vínculo:¿con qué otros elementos desea compararlo? Define el grupo dentro del cual se compara. Técnicamente, tiene un impacto sobre cuándo t2.* será NULL. Si hubiera dado la condición en t2.popularity a where
en cambio, no recibiría ningún NULL (es decir, no encontraría elementos con el valor más bajo) para grupos donde los elementos más bajos tienen poca popularidad.