2017-11-04 3 views
2

Die folgende Abfrage wählt den niedrigsten Preis Produkt in jeder Produktlinie von products Tabelle:MySQL - den niedrigsten Wert aus einer Tabelle auswählen mit JOIN

SELECT 
    a.productline, a.productCode, a.productName, a.buyprice 
FROM 
    products a 
     LEFT JOIN 
    products b ON a.productline = b.productline 
     AND b.buyprice < a.buyprice 
WHERE 
    b.productcode IS NULL; 

Sie den Code finden here. Ein Online-Editor zum Testen des Codes ist here.

Ich kann einfach nicht verstehen, wie die Abfrage mit einer gegebenen productLine aus Tabelle a die niedrigste buyPrice findet. Für eine bestimmte Zeile in a mit einer bestimmten productLine, möglicherweise mehrere Zeilen aus der Tabelle b. 1) Wie wird der niedrigste ausgewählt? 2) Wie kann b.productcode jemals NULL als Tabelle a und b die gleiche Tabelle sein?

+0

Entfernen Sie die WHERE-Klausel und verwenden Sie 'SELECT *' - Dann sehen Sie, wie LEFT JOIN funktioniert. –

Antwort

0

Wenn Sie an dieser Stelle, diese Abfrage auszuführen sind:

SELECT 
    a.productline, a.productName, a.buyprice, b.buyprice, b.productName 
FROM products a 
LEFT JOIN products b ON a.productline = b.productline 
     AND b.buyprice < a.buyprice 
ORDER BY 
    a.productline, b.buyprice, a.buyprice, b.productName 
LIMIT 5 

Sie dieses Ergebnis:

| productline |    productName    | buyprice | buyprice |    productName    | 
|--------------|-------------------------------------|----------|----------|-------------------------------------| 
| Classic Cars | 1958 Chevy Corvette Limited Edition | 15.91 | (null) | (null)        | 
| Classic Cars | 1982 Lamborghini Diablo    | 16.24 | 15.91 | 1958 Chevy Corvette Limited Edition | 
| Classic Cars | 1966 Shelby Cobra 427 S/C   | 29.18 | 15.91 | 1958 Chevy Corvette Limited Edition | 
| Classic Cars | 1970 Plymouth Hemi Cuda    | 31.92 | 15.91 | 1958 Chevy Corvette Limited Edition | 
| Classic Cars | 1961 Chevrolet Impala    | 32.33 | 15.91 | 1958 Chevy Corvette Limited Edition | 

Also, wenn Sie in der Spalte ganz rechts schauen, werden Sie „1958 Chevy sehen Corvette Limited Edition "wiederholt viele Male. Dies liegt daran,

  1. die Produkte Tabelle mit sich selbst verglichen wird (dies ein genannt wird "self join")
  2. die Join-Bedingung a.productline = b.productline bedeutet "Classic Cars" sind aufeinander abgestimmt gegen "Classic Cars" (und so auf für jeden Wert Produktlinie), so ALL „Classic Cars“ von b sind in a (zu EACH „Classic Car“ verglichen und Sie viele, viele Zeilen, die von der Art und Weise) erhalten.
  3. dann wird die a.buyprice zu b.buyrice verglichen, die weniger als das a.buyprice werden müssen. Jedoch kann das billigste Auto ($ 15.91) keine übereinstimmende Reihe haben, die weniger als der billigste Preis ist, so dass die LEFT JOIN es erlaubt, dass die nicht übereinstimmende Reihe in das Ergebnis eingeschlossen wird und alle b Spalten sind NULL für die billigste Wagenreihe.
  4. entfernt dann die where clause alle Zeilen, in denen b.productcode irgendeinen Wert hat (da diese nicht von Interesse sind die billigsten a.buyprice bei der Suche)

Und deshalb nur die billigsten (niedrigsten) Preise werden aufgelistet, wenn jede Spalte aus b IS NULL

+0

'Jedoch kann das billigste Auto ($ 15.91) keine passende Reihe haben '- wenn es erwähnt wurde, dass dieses billigste Auto von der Tabelle' a 'war, dann wäre es einfacher zu verstehen. –

+0

'AND b.buyprice

+0

Es kann! Verändern Sie einfach das Prädikat, um einen höheren Preis als die aktuelle Zeile zu verlangen. (Verwenden> statt <) dann gilt die gleiche Logik, außer dass Sie den höchsten Preis entdecken, nicht den niedrigsten –

Verwandte Themen