Това изисква известно внимание къде да се постави условието (до where
или до on
?), за да не бъдете подведени :-) Трябва да добавите условието за t1 към where
клауза и за t2 до on
клауза:
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 */
Не съм го тествал, но трябва да работи.
Опит за обяснение: условието in where клаузата засяга кои елементи считате за потенциални елементи с най-ниска стойност. Докато условието в on
клаузата засяга връзката:с какви други елементи искате да я сравните? Той определя групата, в която сравнявате. Технически, това оказва влияние върху това кога t2.* ще бъде NULL. Бяхте ли дали условието за t2.popularity на where
клауза вместо това, няма да получите никакви NULL (т.е. да не намерите елементи с най-ниска стойност) за групи, където най-ниските елементи имат ниска популярност.