2016-12-10 2 views
1

Ich gehe durch die Mysql-Dokumente und unter the common queries section, erwähnen sie, wie Sie den maximalen Spaltenwert einer Tabelle mit einem LINKEN JOIN erhalten. Hier ist die Tabelle:Wie funktioniert die Verwendung von JOIN zum Sortieren von Tabellen?

SELECT * FROM shop; 

+---------+--------+-------+ 
| article | dealer | price | 
+---------+--------+-------+ 
| 0001 | A  | 3.45 | 
| 0001 | B  | 3.99 | 
| 0002 | A  | 10.99 | 
| 0003 | B  | 1.45 | 
| 0003 | C  | 1.69 | 
| 0003 | D  | 1.25 | 
| 0004 | D  | 19.95 | 
+---------+--------+-------+ 

Und hier ist die Abfrage:

SELECT s1.article, s1.dealer, s1.price 
FROM shop s1 
LEFT JOIN shop s2 ON s1.price < s2.price 
WHERE s2.article IS NULL; 

Es gibt mehrere Dinge, die ich nicht Kopf oder Zahl machen.

Zunächst ohne LIMIT 1 Anweisung oder Bestellung (die den Zweck der JOIN besiegt), ich verstehe nicht, wie es nur eine Zeile zurückgeben kann (LEFT JOIN unter der Annahme ist ein LEFT OUTER JOIN, die alle Zeilen in der linken Tabelle gibt nach w3 Schools).

Zweitens verstehe ich nicht die Semantik von s1.price < s2.price. Ist das Wort „, wählen Sie alle Zeilen aus s2, wo die Anweisung s1.price < s2.price wahr ist (und wenn ja, dann w3 Schulen über Link ist mysql nicht wahr)? Ie LEFT JOIN a LEFT INNER JOIN?

Schließlich ist die WHERE s2.article IS NULL macht absolut keinen Sinn für mich, da jeder Datensatz in der Tabelle hat eine article Attribut (vor allem, da es keine zweideutigen 0000 Artikel ist).

+1

Das 'where s2.article is null 'bedeutet, dass (unter der Annahme, dass das Feld nicht null ist) Details von s1 nur für Elemente gefunden werden, bei denen kein Preis höher ist als in der Tabelle. – TZHX

Antwort

2

der Verbindungszustand s1.price < s2.price bedeutet, dass jede s1 Reihe mit jeder s2 Reihe beitreten werden, die einen höheren Preis.

Das bedeutet, dass für die Zeile in der Tabelle s1 mit dem höchsten Preis (19,95) keine s2 Zeilen übereinstimmen. Da es in einem äußeren Join ist, wird die nicht übereinstimmende s1 Zeile trotzdem zurückgegeben, aber alle s2 Spalten werden auf null festgelegt.

Die where s2.article is null löscht dann alle Zeilen außer dieser. Sie können es informativ finden die Ergebnisse vor diesem Zeitpunkt mit

SELECT s1.article, 
     s1.dealer, 
     s1.price, 
     s2.article, 
     s2.dealer, 
     s2.price 
FROM shop s1 
     LEFT JOIN shop s2 
     ON s1.price < s2.price; 

Sie werden sehen, die 1,25 s1 Reihe verbindet sich mit 6 s2 Reihen, die 10,99 Zeile mit einem, und der 19.95 ein gar keine zu inspizieren.

Hinweis: Es wird nicht garantiert, dass nur eine Zeile zurückgegeben wird. Wenn mehrere Zeilen für den höchsten Preis gebunden sind, werden alle zurückgegeben.

+0

Oh das ist Genie. Vielen Dank! – Rdesmond

Verwandte Themen