2017-02-09 163 views
0

我有一個問題爲視圖構建MySQL查詢。以下是我的關係數據庫結構和一些示例數據。MySql查詢關係數據庫中的視圖

travel 
| ID | NUM | 
| 01 | N01 | 
| 02 | N02 | 

travel_has_flight 
| travel_ID | flight_ID | 
| 01  |  01 | 
| 01  |  02 | 
| 02  |  03 | 

flight 
| ID | NUM | DEPARTURE_DATE | ARRIVAL_DATE | 
| 01 | A01 | 2010-10-10 12:50 | 2010-10-10 17:50 | 
| 02 | A02 | 2010-10-17 14:50 | 2010-10-17 14:50 | 
| 03 | A03 | 2010-10-22 12:50 | 2010-10-22 17:50 | 

預期輸出:

從查詢作爲視圖。

| travel_ID | travel_NUM | flight_NUM1 | flight_DEPARTURE_DATE | flight_NUM2 | flight_ARRIVAL_DATE | 
| 01  | N01  | A01  | 2010-10-10 12:50 |  A02  | 2010-10-17 14:50 | 
| 02  | N02  | A03  | 2010-10-10 12:50 |  A03  | 2010-10-17 14:50 | 

輸出應該如下。旅行可以包含1班航班。在這種情況下,輸出是來自此次航班的行程+日期的數據。如果旅行包含2班航班,則應返回旅行+第一班航班的出站日期和第二班航班的入境日期的數據。

我會很樂意爲此提供任何幫助。

###更新###

我與SQL低於目前卡住了,問題是現在如何單獨flight_NUM的加入...

SELECT t.ID, t.NUM, Min(f.DEPARTURE_DATE), MAX(f.ARRIVAL_DATE) 
FROM travel t 
INNER JOIN travel_has_flight tf ON tf.TRAVEL_ID = t.ID 
INNER JOIN flight f ON f.ID = tf.FLIGHT_ID 
GROUP BY t.NUM 
+0

你是否爲一家航空公司工作? – Shaggy

+1

試圖升級我的第三方計費系統以適應我的需求? – RUTKLUK

回答

-1

有辦法少做它。我願意做一個UNION 2所選擇的,就像這樣:

SELECT `travel`.`ID` as 'TRAVEL_ID',`travel`.`NUM` as 'TRAVEL_NUM', `flight`.`NUM` as 'FLIGHT_NUM1',`flight`.`DEPARTURE_DATE`as 'FLIGHT_DEPARTURE_DATE',`flight`.`NUM`as 'FLIGHT_NUM2',`flight`.`ARRIVAL_DATE`as 'FLIGHT_ARRIVAL_DATE' 
FROM `travel` 
INNER JOIN `travel_has_flight` on `travel`.`ID`=`travel_has_flight`.`travel_ID` 
INNER JOIN `flight` on `travel_has_flight`.`flight_ID`=`flight`.`ID` 
WHERE `travel`.ID in (SELECT travel_ID FROM `travel_has_flight` GROUP BY travel_ID HAVING count(`flight_ID`)=1) 
UNION 
SELECT T.TRAVEL_ID,T.TRAVEL_NUM,MIN(T.FLIGHT_NUM1),MIN(T.FLIGHT_DEPARTURE_DATE),MAX(T.FLIGHT_NUM2),MAX(T.FLIGHT_ARRIVAL_DATE) 
FROM 
(SELECT `travel`.`ID` as 'TRAVEL_ID',`travel`.`NUM` as 'TRAVEL_NUM', `flight`.`NUM` as 'FLIGHT_NUM1',`flight`.`DEPARTURE_DATE`as 'FLIGHT_DEPARTURE_DATE',`flight`.`NUM`as 'FLIGHT_NUM2',`flight`.`ARRIVAL_DATE`as 'FLIGHT_ARRIVAL_DATE' 
FROM `travel` 
INNER JOIN `travel_has_flight` on `travel`.`ID`=`travel_has_flight`.`travel_ID` 
INNER JOIN `flight` on `travel_has_flight`.`flight_ID`=`flight`.`ID` 
WHERE `travel`.ID in (SELECT travel_ID FROM `travel_has_flight` GROUP BY travel_ID HAVING count(`flight_ID`)>1)) as T 
GROUP BY T.TRAVEL_ID,T.TRAVEL_NUM 
+0

感謝您的建議。我會在稍後嘗試。 – RUTKLUK

+0

謝謝你在我的作品...在MySql MariaDB 10.1.21 ..不在10.1.19我有。 – RUTKLUK

0

你的表,

table travel (ID int, NUM varchar()) 
table leg (travel_ID int, flight_ID) 
table flight (ID int, NUM varchar(), DEPARTURE date, ARRIVAL date) 

加入旅遊與腿,飛行加盟腿,

select <more below> 
from travel t 
<how> join leg l where t.ID = l.travel_ID 
<how> join flight f where l.flight_ID == f.ID 

現在,決定這些是內部連接還是外部連接?

即使在travel和travel_has_flight(腿)之間加入時沒有匹配,您還想要結果嗎?如果不是,則使用內連接,如果是,則使用外連接。 (對您的樣本數據很重要)

即使在travel_has_flight(腿)和航班之間的聯接沒有匹配時,您還想要結果嗎?如果不是,則使用內連接,如果是,則使用外連接。 (不要緊,你的樣本數據)

你說使用內部連接,

select <more below> 
from travel t 
inner join leg l where t.ID = l.travel_ID 
inner join flight f where l.flight_ID == f.ID 

在您的樣本數據,結果集是,

t. | t. | l.  | l.  | f. | f. | f.    | f. 
ID | NUM | travel_ID | flight_ID | ID | NUM | DEPARTURE  | ARRIVAL 
01 | N01 | 01  | 01  | 01 | A01 | 2010-10-10 12:50 | 2010-10-10 17:50 
01 | N01 | 01  | 02  | 02 | A02 | 2010-10-17 14:50 | 2010-10-17 14:50 
02 | N02 | 02  | 03  | 03 | A03 | 2010-10-22 12:50 | 2010-10-22 17:50 

但是,你說使用內部連接,所以您正在尋找1:1 您需要按日期排序的這些數據。假設理智數據(始發< =到達)

with (
select t.ID as tid, t.NUM as tnum, f.DEPARTURE as dep, f.ARRIVAL as arr 
from travel t 
inner join leg l where t.ID = l.travel_ID 
inner join flight f where l.flight_ID == f.ID 
group by t.NUM 
order by t.NUM, DEPARTURE 
) as parts, 
<query> 

現在,你將如何在兩行合併在上面的「零件」表的連接部位?

+0

謝謝你的解釋。在我的情況下,我使用mariadb 10.1.19,它無法在嵌套表/子查詢上工作。更新到10.1.21解決了查詢問題。 – RUTKLUK