Сложный Mysql-запрос для получения информации

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 

Шесть строк предназначены для демонстрации; У меня около 500 строк таких данных. Приложение, над которым я работаю, попросит пользователя предоставить две исходные точки и предоставит пользователю все общие адресаты между этими двумя источниками.

Например, если пользователь вводит "KATL" и "KLAX" в качестве аэропортов происхождения, запрос отображает общее назначение между двумя источниками, которое является "KCLT".

Я пробовал разные подходы к устранению проблемы, но не смог добиться желаемой функциональности. Я попробовал объединения и разные методы ActiveRecord.

  • 0
    может ли быть два пункта назначения в качестве ответа
  • 0
    Вам нужно предоставить хотя бы скелетный пример кода, который вы пытаетесь исправить. Это не кажется сложным, поэтому неясно, где ваша проблема.
Показать ещё 4 комментария
Теги:

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;
  • 0
    Спасибо, он вернул именно то, что я хотел вернуть.
0

Я предполагаю, что ваше имя модели Path

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

это даст вам все адресаты для данного двух источников без сложного запроса mysql

благодаря

  • 0
    Это не будет работать, p может принадлежать только origin2, но может быть несколько рейсов, поэтому количество будет> 1, и оно будет возвращено как совпадение, а это не так. «Сложный» запрос - это то, что вам нужно в этом случае, например, если у вас есть 1 000 000 путей, вам не нужно загружать их в память, проходить по ним, собирая счетчики, uniq, compact и т. Д.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню