Сортировать по дате появления первого ребенка модели - PullRequest
0 голосов
/ 05 октября 2018

У меня есть следующая структура для событий и их повторений

Событие: (идентификатор, имя, место проведения) has_many: occurences

Событие (идентификатор, дата, идентификатор события) принадлежит_ к: событие

Я хочу получить события (только данные о событиях) с повторяемостью больше, чем сегодня (occurences.date> Date.Today)

События должны быть упорядочены по дате их следующего повторения (больше, чемсегодня) в хронологическом порядке

Следующий запрос дает мне данные о событии в порядке, но не позволяет мне заказать

Event.joins(:occurences).where("occurences.date>?",DateTime.now).distinct#.order('occurences.date')

, но я не могу заказать его, так как он говорит

Выражение # 1 предложения ORDER BY отсутствует в списке SELECT, столбец ссылок 'eventdatabase.occurences.starts'

Мне нужно использовать отдельный, чтобы убедиться, что я получаю только одно событие независимо от того,сколько у него случаев

Я использую mysql и rails5

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Для этой задачи запрос SQL может выглядеть следующим образом:

SELECT E.id AS event_id, MIN(OC.date) AS next_date
FROM events E
  JOIN occurences OC ON OC.event_id = E.id
WHERE OC.date > NOW()
GROUP BY E.id
ORDER BY MIN(OC.date);

Вот песочница: http://rextester.com/HCTE57488

Так что я думаю, что код Ruby будет:

Event.joins(:occurences)
     .where('occurences.date > ?', DateTime.now)
     .group('events.id')
     .order('min(occurences.date)')
0 голосов
/ 05 октября 2018

Я интерпретирую

События должны быть упорядочены по дате их следующего повторения (больше, чем сегодня) в хронологическом порядке

как самые ранние occurance.date.

Event.joins(:occurences)
     .where("occurences.date>?",DateTime.now)
     .group(:id)
     .select('events.*, min(occurences.date) as next_recurrence')
     .order('next_recurrence')

Группа, похожая на более сильную особенность.Вы получите один ряд (за одну «группу»).Технически мы должны сгруппировать по events.*, но mysql обманет и позволит сгруппировать по первичному ключу, чтобы сделать то же самое.

При выполнении группировки по агрегирующим функциям, таким как min, работают надгруппа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...