2017-05-07 3 views
0

Ich habe mehrere Tabellen Flüge Daten darstellen:von Artikel den niedrigsten Preis wählen in SQL mit mehreren verbindet

Flüge:

ID | NMB | DATE 
1 | CA1 | 2017-05-26 
2 | CA1 | 2017-05-27 
3 | CA2 | 2017-05-26 
4 | CA2 | 2017-05-27 

Flughäfen:

ID | NAME 
1 | JFK 
2 | LAX 

flights_arrival:

ENTITY_ID (flights) | TARGET_ID (airports) 
1     | 1 
2     | 1 
3     | 2 
4     | 2 

flights_price:

ENTITY_ID (flights) | VALUE 
1     | 455 
2     | 650 
3     | 750 
4     | 880 

Ich versuche, den niedrigsten Preis für jeden Flug für jeden Ankunftsflughafen auszuwählen. Was ich will, ist dies:

ID | ARRIVAL | PRICE 
1 | 1  | 455 
3 | 2  | 750 

Dies ist die SQL-Abfrage, die ich gebaut, aber die MIN auf den flights_price angewandte Funktion kehrt nicht nur den niedrigsten Preis für den Flug aber alle Einträge:

 SELECT 
      f.id AS id, 
      fa.target_id AS arrival, 
      MIN(fp.value) AS price 
     FROM flights_price AS fp 
     JOIN flights AS f ON fp.entity_id=f.id 
     JOIN flights_arrival AS fa ON fa.entity_id=f.id 
     WHERE 
      fa.target_id IN (1, 2) 
     GROUP BY 
      fa.target_id, 
      fp.value, 
      f.id; 

Was Ich mache falsch? Ich habe auch Unterabfragen ohne Erfolg versucht.

+1

In der Regel eine Gruppen durch das, was man wählt. Wenn die Milliarde oder so Antworten auf ähnliche Fragen hier nicht helfen, siehe https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to- ich-bin-ein-sehr-einfach-sql-query – Strawberry

+0

was 'ARRIVAL'-Spalte hier gehört zu welcher Tabellenspalte –

+0

'Arrival' gehört zu' flights_arrival' aliased von 'fa'. –

Antwort

0

Sie haben value Spalte in GROUP BY, wenn Sie ein Aggregat Spalte auf sie anwenden müssen, können Sie es von GROUP BY entfernen müssen (sonst wird es nur auf nur einen Wert pro Gruppe angewendet werden, um die Aggregation überflüssig machen), zB :

SELECT fa.entity_id, f.name, fa.target_id, a.name, MIN(value) 
FROM flights_arrival fa JOIN flights_price fp ON fa.entity_id = fp.flights 
JOIN flights f ON fa.entity_id = f.id 
JOIN airports a ON fa.target_id = a.id 
WHERE fa.target_id IN (1,2) 
GROUP BY fa.entity_id, f.name, fa.target_id, a.name; 
+0

Wenn ich 'fp.value' aus der' GROUP BY' entferne, erhalte ich den Fehler: 'Syntaxfehler oder Zugriffsverletzung: 1055 Ausdruck # 3 der ORDER BY-Klausel ist nicht in GROUP BY' –

+0

Kannst du den Fehler posten? –

0

diese Abfrage -

SELECT fp.entity_id AS id, target_id AS arrival, MIN(value) AS price  
FROM flights_arrival AS fa 
INNER JOIN flights_price AS fp ON (fp.entity_id = fa.entity_id) 
GROUP BY target_id; 

Von Ihrem Ausgang und Ihre versuchte Abfrage, ich vermute, dass Sie nur die Flüge müssen die Ankunfts- und Preis haben. Aus diesem Grund ist es nicht notwendig, den Flugtisch zu benutzen. Sie können auch den WHERE-Filter vor der Gruppe hinzufügen, um Ergebnisse für bestimmte IDs anstelle von allen Flügen zu erhalten.

Die ENTITY_ID Spalte könnte sein die Anweisung SELECT, obwohl es nicht in der GROUP BY ist seit der db ist MySQL. Auch wie in flights_price Tabelle die entity_id ist einzigartig, daher fp.entity_id wird den richtigen Wert für den Mindestpreis erhalten.

SQLfiddle

+0

Die Abfrage, die Sie vorschlagen, funktioniert nicht. Wenn Sie in einem ausgewählten Feld in einer Anfrage 'GROUP BY' wählen, müssen Sie' GROUP BY' in den anderen ausgewählten Feldern verwenden.Andernfalls wird SQL eine 'Syntax error of ORDER BY-Klausel'-Ausnahme auslösen. In diesem Fall müssen wir einen GROUP BY-Ausdruck in den Feldern fp.value und fp.entity_id haben. Aber du hast darauf hingewiesen, dass ich den Flugtisch überhaupt nicht brauche, das stimmt, und ich teste die Anfrage ohne sie weiter. –

+0

Sie verwenden MySQL richtig? MySQL (5.9) erlaubt die Auswahl von Spalten, die nicht in einer Gruppe nach Anweisung sind. Bitte beachten Sie [Fiddle] (http://sqlfiddle.com/#!9/2c3ad6c/1). Wenn Sie MySQL nicht verwenden, funktioniert die Abfrage nicht. – Shiblu

+0

Ja, ich benutze MySQL (5.7.17), aber die Abfrage funktioniert nicht, ich bekomme 'GROUP BY' Ausnahmen, vielleicht mache ich etwas falsch. Deine Fiddle funktioniert, danke, dass du sie rausgebracht hast. Ich werde weiter daran arbeiten. –

Verwandte Themen