2017-02-09 7 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便が含まれます。この場合、出力は、この1回のフライトの旅行+日付のデータです。旅行に2つのフライトが含まれている場合は、第1フライトの旅行+出発日と第2フライトのインバウンド日付からのデータを返す必要があります。

私はこれに関する助けを喜んでいただきます。

###アップデート###

私が行うには、いくつかの方法があります

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

...質問は今、別のflight_NUMさんを追加する方法で、SQL以下で現在立ち往生していますそれ。 、

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 

、以下のとおりです。私はこのように、2つの選択のUNIONにしてくださいこれらが内部結合であるか外部結合であるかを決定します。

旅行と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を探しています このデータは日付順に並べる必要があります。今正気データ(DEPARTURE < = ARRIVAL)

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> 

を想定し、どのように部品を接続するために上記の「部」の表に2つの行を結合するのでしょうか?

+0

ありがとうございます。私の場合はmariadb 10.1.19を使用していましたが、ネストしたテーブル/サブクエリでは動作できませんでした。 10.1.21に更新すると、問題が解決されました。 – RUTKLUK

関連する問題