0

現在、API から情報を取得してデータベースに保存するプロジェクトに取り組んでいます。テーブル構造は次のようになります。

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 

6 つの行はデモンストレーション用です。私はそのようなデータを約500行持っています。私が取り組んでいるアプリケーションは、ユーザーに 2 つの起点を提供するように要求し、これら 2 つの起点の間のすべての共通の目的地をユーザーに提供します。

たとえば、ユーザーが出発空港として「KATL」と「KLAX」を入力すると、クエリは 2 つの出発地の共通の目的地である「KCLT」を表示します。

問題を解決するためにさまざまなアプローチを試みましたが、目的の機能を実現できません。結合とさまざまな ActiveRecord メソッドを試してみましたが、役に立ちませんでした。

4

2 に答える 2

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;
于 2012-10-04T17:52:25.360 に答える
0

モデル名をパスと想定しています

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

これにより、複雑なmysqlクエリなしで、指定された2つのオリジンのすべての宛先が得られます

ありがとう

于 2012-10-04T18:10:58.460 に答える