2012-10-04 103 views
0

我目前正在從事一個項目,以從API獲取一些信息並將其存儲在數據庫中。表結構看起來像這樣:複雜的Mysql查詢獲取信息

id  ident aircraft_type origin destination timestamp  departure_time 
1  AWE1843  A321  KATL  KCLT 2012-10-04 10:46:34 2012-10-04 10:01:00 
2  ASQ5758  CRJ2  KATL  KIAD 2012-10-04 10:51:11 2012-10-04 09:40:00  
3  AAL2404  B738  KLAX  KDFW 2012-10-04 10:46:13 2012-10-04 08:23:00  
4  AAL2400  B738  KLAX  KDFW 2012-10-04 09:54:13 2012-10-04 07:31:00  
5  UAL912  B752  KLAX  KJFK 2012-10-04 10:19:24 2012-10-04 05:39:00 
6  DAL1162  B752  KLAX  KCLT 2012-10-04 09:38:00 2012-10-04 04:44:30 

這六行用於演示目的;我有大約500行這樣的數據。我正在處理的應用程序將要求用戶提供兩個來源點,並將爲用戶提供這兩個來源之間的所有常用目的地。

例如,如果用戶輸入「KATL」和「KLAX」作爲起點機場,則查詢顯示兩個起點之間的共同目的地是「KCLT」。

我嘗試了不同的方法來解決問題,但無法獲得所需的功能。我試過連接和不同的ActiveRecord方法,沒有用。

+0

纔能有兩個目的地爲答案 –

+0

您需要提供至少你試圖修復代碼的骨架例子。這看起來並不複雜,所以目前還不清楚你的問題在哪裏。 – tadman

+0

@ParitoshSingh:我需要得到兩個原點之間的所有目的地。它可以是2,3或甚至100.它實際上是一個簡單的等式,即來自兩個來源的所有目的地。 – user814446

回答

1

像這樣的事情會工作,它會給你,雖然這兩個表,你可以使用S *或E *挑選特定的表,如果你需要:。

select * from (select * from flights where origin = 'KATL') s 
inner join (select * from flights where origin = 'KLAX') e 
on e.destination = s.destination; 

如果你只是想顯示目的地:

select distinct s.destination from (select * from flights where origin = 'KATL') s 
inner join (select * from flights where origin = 'KLAX') e 
on e.destination = s.destination; 
+0

感謝它返回正是我想要返回。 – user814446

0

我假設你的型號名稱爲路徑

path = Path.where("origin in (#{ORIGIN1},#{ORIGIN2})") 
path.uniq.collect{ |p| p if path.count(p) > 1}.compact 

這會給你所有的DEST inations對給出了兩個起源無需進行復雜的MySQL查詢

感謝

+0

這不起作用,p可能只屬於origin2,但可能有多個航班,所以count> 1,它將作爲匹配返回,而不是。在這種情況下,「複雜」查詢就是你想要的,例如,如果你有100萬條路徑,你不需要將它們加載到內存中,通過它們循環收集計數,uniq,壓縮等。 – iouri