Isso requer alguma atenção onde colocar a condição (para
where
ou para on
?) para que você não seja enganado :-) Você precisa adicionar a condição para t1 em where
cláusula e para t2 para 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 */
Não testei, mas deve funcionar.
Tentativa de explicação: a condição na cláusula where afeta quais elementos você considera como elementos potenciais com menor valor. Considerando que a condição em
on
cláusula afeta a ligação:com quais outros elementos você deseja compará-la? Ele define o grupo dentro do qual você compara. Tecnicamente, tem um impacto em quando t2.* será NULL. Você deu a condição em t2.popularity para where
Em vez disso, você não receberia nenhum NULL (ou seja, não encontraria elementos com valor mais baixo) para grupos em que os elementos mais baixos tivessem baixa popularidade.