Dies erfordert einige Aufmerksamkeit, wo die Bedingung platziert werden soll (an where
oder auf on
?), damit Sie nicht hereingelegt werden :-) Sie müssen die Bedingung für t1 zu where
hinzufügen -Klausel und für t2 auf on
Klausel:
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 */
Habe es nicht getestet, aber es sollte funktionieren.
Erklärungsversuch: Die Bedingung in der where-Klausel wirkt sich darauf aus, welche Elemente Sie als potenzielle Elemente mit dem niedrigsten Wert betrachten. Während die Bedingung in on
Klausel wirkt sich auf die Verknüpfung aus:Mit welchen anderen Elementen möchten Sie sie vergleichen? Es definiert die Gruppe, innerhalb derer Sie vergleichen. Technisch gesehen hat es einen Einfluss darauf, wann t2.* NULL ist. Hätten Sie die Bedingung für t2.popularity an where
gegeben stattdessen erhalten Sie keine NULL-Werte (d. h. keine Elemente mit dem niedrigsten Wert finden) für Gruppen, in denen die niedrigsten Elemente eine geringe Beliebtheit haben.