To vyžaduje určitou pozornost, kam umístit podmínku (do where
nebo on
?), abyste se nenechali napálit :-) Podmínku pro t1 musíte přidat do where
klauzule a pro t2 na on
klauzule:
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 */
Netestoval jsem to, ale mělo by to fungovat.
Pokus o vysvětlení: podmínka, ve které klauzule where ovlivňuje, které prvky považujete za potenciální prvky s nejnižší hodnotou. Zatímco podmínka v on
klauzule ovlivňuje vazbu:s jakými dalšími prvky ji chcete porovnat? Definuje skupinu, v rámci které porovnáváte. Technicky to má vliv na to, kdy bude t2.* NULL. Kdybyste dali podmínku na t2.popularity do where
místo toho byste neobdrželi žádné hodnoty NULL (tj. nenašli prvky s nejnižší hodnotou) pro skupiny, kde mají nejnižší prvky nízkou popularitu.