2017-05-07 49 views
0

我代表航班數據的多個表:在具有多個SQL選擇價格最低的項目加入

航班:

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

機場:

ID | NAME 
1 | JFK 
2 | LAX 

flights_arrival:

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

航班價格:

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

我試圖爲每個抵達機場的每個航班選擇最低價格。我想是這樣的:

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

這是SQL查詢我建立,但是應用在flights_price爲飛行不會返回只有最低價格MIN功能,但所有條目:

 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; 

什麼我做錯了?我也試過沒有成功的子查詢。

+1

作爲一個規則,一個組由事情之一選擇。如果十億左右的答案對這裏的類似問題沒有幫助,請參閱https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-我想要一個非常簡單的sql查詢 – Strawberry

+0

這裏的'ARRIVAL'列屬於哪個表列 –

+0

'ARRIVAL'屬於'flights_arrival',被'fa'替代。 –

回答

0

您在GROUP BYvalue列,如果你需要在它應用的聚合列,你需要從GROUP BY取出(否則它將只在一個每個組只值被應用,使得聚集多餘的),例如, :

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

如果我從GROUP BY中刪除'fp.value',我得到以下錯誤:'語法錯誤或訪問衝突:1055 ORDER BY子句的表達式#3不在GROUP BY中' –

+0

您能否發佈錯誤? –

0

嘗試此查詢 -

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; 

從你的輸出和你試圖查詢,我猜測,你只需要具有人數和價格的航班。這就是爲什麼不需要使用航班表。您也可以在羣組之前添加WHERE過濾器,以獲取特定ID的結果,而不是所有航班。

的ENTITY_ID列可能是在選擇,即使它是不存在GROUP BY聲明,因爲該數據庫是MySQL的。同樣在flights_priceentity_id是唯一的,因此fp.entity_id將獲得最低價格的正確值。

SQLfiddle

+0

您提出的查詢不起作用。每當您在請求中的選定字段上使用「GROUP BY」時,您必須在其他選定字段上使用「GROUP BY」。否則,SQL將拋出「ORDER BY子句的語法錯誤」異常。在這種情況下,我們必須在「fp.value」和「fp.entity_id」字段中有一個「GROUP BY」表達式。但是你提出了一個觀點,即我根本不需要飛行表,這是真的,我沒有它就繼續測試請求。 –

+0

您正在使用MySQL嗎? MySQL(5.9)允許選擇不在group by語句中的列。 請參閱此[小提琴](http://sqlfiddle.com/#!9/2c3ad6c/1)。如果你不使用MySQL,查詢將不起作用。 – Shiblu

+0

是的我正在使用MySQL(5.7.17),但查詢不起作用,我得到了'GROUP BY'異常,也許我做錯了什麼。你的小提琴的作品,謝謝你把它放在那裏。我將繼續努力。 –