Ciò richiede una certa attenzione su dove mettere la condizione (in where
o su on
?) in modo da non farti ingannare :-) Devi aggiungere la condizione per t1 a where
clausola e per t2 su on
clausola:
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 */
Non l'ho testato, ma dovrebbe funzionare.
Tentativo di spiegazione: la condizione in cui la clausola influisce sugli elementi che consideri come potenziali elementi con il valore più basso. Considerando che la condizione in on
clausola influisce sul collegamento:con quali altri elementi vuoi confrontarlo? Definisce il gruppo all'interno del quale confrontare. Tecnicamente, ha un impatto su quando t2.* sarà NULL. Avevi fornito la condizione su t2.popularity a where
clausola invece, non riceverai alcun NULL (cioè non troverai elementi con il valore più basso) per i gruppi in cui gli elementi più bassi hanno una bassa popolarità.