2012-10-04 83 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