Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie schreibe ich die größten n pro Gruppentyp-Abfrage, aber mit zusätzlichen Bedingungen?

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.