sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo escribir la consulta de tipo n más grande por grupo, pero con condiciones adicionales?

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.