2016-05-30 6 views
2

過去3ヶ月(90日間)以内に3回以上のサービス業務を行っている航空機をすべて列挙します。また、すべての航空機登録番号、飛行機タイプ、および製造業者を記載してください。MySql Query(ブレインチャレンジ)

パイロット表:

reg_nbr, plane_type, manufacturer, resident, date_service 
'101', 'SE Prop', 'Lear', '1', '1998-12-01' 
'202', 'DE Prop', 'Cessna', '1', '1999-11-22' 
'303', 'SE Jet', 'Bombardier', '1', '2000-07-06' 
'404', 'ME Jet', 'Lear', '1', '2001-02-24' 
'505', 'SE Prop', 'Cessna', '0', '2003-12-01' 
'606', 'DE Prop', 'Bombardier', '1', '2004-11-22' 
'707', 'SE Jet', 'Lear', '1', '2005-07-06' 
'808', 'ME Jet', 'Cessna', '0', '2005-02-24' 
'909', 'SE Prop', 'Bombardier', '1', '2002-02-12' 

サービス表:

workorder_nbr, file_nbr, reg_nbr, date_start, date_end, work_description, hours_worked, person_nbr 
'2061', '3101', '101', '2014-03-16', '2014-03-16', 'Maint', '2', '901' 
'2062', '3101', '101', '2014-07-20', '2014-07-21', 'Maint', '3', '901' 
'2063', '3102', '202', '2015-12-22', '2015-12-22', 'Replace', '5', '901' 
'2064', '3102', '202', '2015-07-12', '2015-07-13', 'Clean', '2', '901' 
'2065', '3103', '303', '2015-05-01', '2015-05-01', 'Maint', '2', '901' 
'2066', '3104', '404', '2015-07-09', '2015-07-09', 'Clean', '5', '901' 
'2067', '3108', '505', '2015-07-09', '2015-07-09', 'Maint', '2', '901' 
'2068', '3106', '606', '2015-08-21', '2015-08-21', 'Check', '1', '901' 
'2069', '3101', '101', '2016-01-15', '2016-01-16', 'Maint', '3', '901' 
'2070', '3101', '101', '2016-01-31', '2016-01-31', 'Repair', '15', '901' 
'2071', '3101', '101', '2016-02-08', '2016-02-10', 'Repair', '8', '901' 
'2072', '3108', '505', '2016-01-08', '2016-01-09', 'Upgrade', '20', '901' 
'2073', '3108', '505', '2016-02-02', '2016-02-02', 'Repair', '1', '901' 
'2074', '3108', '505', '2014-02-11', '2014-02-11', 'Maint', '1', '901' 

マイクエリ:(とにかくその間違った)

SELECT service.reg_nbr, plane_type, manufacturer 
FROM service, aircraft 
WHERE date_start BETWEEN (date(NOW() AND 90DAY) 
GROUP BY service.reg_nbr 
HAVING COUNT(service.reg_nbr) >=3 

私はそれを作るためにどのようにすることをCLASE WHEREに苦労しています質問の必要に応じて現在の日付を90日間戻す)

+0

確かに尋ねるだけですが、あなたの本当の質問にあなたは参加条件を整えていますか?現在の例では暗黙のクロス結合が行われ、デカルト積は* service *と* aircraft *の間にあります。 –

+0

バディ、2つのテーブルに参加する必要はありません。 少なくとも3回以上出現した航空機のみを表示する方法を教えてください。ありがとう – Zeus

+0

私はあなたの友達ではありません。彼らの参加方法は大変重要です。クエリは、テーブル*サービス*からテーブル*航空機*のすべての行にすべての行を結合します。これはあなたが望むものかもしれないが、私はそれを疑う。受け入れられた回答を参照してください。これは明示的な結合を使用し、結合条件は 'a.reg_nbr = s.reb_nbr'です。 'reg_nbr'は唯一の共通属性なので、自然結合と同じです。 –

答えて

1

1つのオプションは、INTERVALを使用するために、次のようになります。ここでは

WHERE date_start BETWEEN CURDATE() - INTERVAL 90 DAY AND CURDATE() 

がいっぱいクエリです:

SELECT s.reg_nbr 
FROM aircraft a 
INNER JOIN service s 
    ON a.reg_nbr = s.reg_nbr 
WHERE date_start BETWEEN CURDATE() - INTERVAL 90 DAY AND CURDATE() 
GROUP BY s.reg_nbr 
HAVING COUNT(*) >= 3 
+0

サービス中であるため、 3つ以上のサービス雇用を持ち、90日前から今日までの範囲の航空機がないため、3日以上3日以上、最初の90日以内に就労していた航空機を表示するという意味ですか? – Zeus

+0

WHERE句を自分の答えに置き換えて、テーブルの最後の90日分のデータに制限する。 'GROUP BY'が起こる前に' WHERE'が適用されます。これはあなたが望むものです –

+0

はい私はそれをしましたあなたは少なくとも3つ以上の '> ='で整備された航空機のみを表示する方法を教えてもらえますか?それは問題の中にあります。受け入れる答えが必要です。 – Zeus

0

あなたはDATE_ADD機能を使用する必要があります。

SELECT service.reg_nbr, plane_type, manufacturer 
FROM service, aircraft 
WHERE date_start BETWEEN date(NOW()) AND DATE_ADD(NOW(), INTERVAL -90 DAY) 

参考:https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-add

+1

'(日付(NOW()構文エラーがあります。) – Blank

+0

構文エラーが修正されました – sonique

+0

それは原因でエラーが発生しましたが、とにかく努力してくれてありがとうございます – Zeus