2016-05-30 52 views
2

列出在過去三個月(90天)內完成三項或更多維修工作的所有飛機。此外,列出所有飛機註冊號,飛機類型和製造商。MySql查詢(大腦挑戰)

飛行員表:

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 

我掙扎在WHERE化酶是如何使它根據問題的要求顯示當前日期至90天)

+0

只是要求確定,但在你真正的問題你有沒有加入條件?你現在的例子會產生一個隱式交叉連接,導致* service *和* aircraft *之間的笛卡爾積。 –

+0

好友,應該加入兩張桌子,並不重要。 你能告訴我如何只顯示出現過至少3次或更多次的飛機嗎?謝謝 – Zeus

+0

我不是你的朋友,朋友。他們如何加入事宜非常重要。您的查詢將table * service *中的每一行連接到table * aircraft *中的每一行。這可能是你想要的,但我懷疑它。查看接受的答案,該答案現在使用顯式連接並且具有連接條件'a.reg_nbr = s.reb_nbr'。它相當於一個自然連接,因爲'reg_nbr'是唯一的共同屬性。 –

回答

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天?或者問題是否意味着要顯示在前90天內有3個或更多維修工作的飛機?您的建議將會 – Zeus

+0

用我的答案替換你的'WHERE'子句以限制到表中最後90天的數據'WHERE'在'GROUP BY'發生之前被應用,這就是你想要的。 –

+0

是的,我做到了它你可以告訴我如何只顯示那些得到至少3個或更多'> ='服務的飛機,它是在那裏的問題。你值得接受的答案。 – Zeus