У меня есть две таблицы, Product
и ProductNewsletter
. Продукт может иметь много значений product_newsletters
, поэтому в рельсах это отношение has_many
на стороне продуктов и belongs_to
на стороне product_newsletter с product_id. Таблицы выглядят так:
products
id title... etc
product_newsletters
id product_id date
Я хотел бы получить продукты, у которых есть product_newsletter в диапазоне дат, а также выбрать дату из найденного product_newsletter в запросе. Таким образом, если у продукта есть два product_newsletter с датами 11-03-2018, 20-03-2018 и 04-04-2018, запросы с датами между 01-03-2018 и 30-01-03-2018 должны отобразить этот продукт дважды один раз с 11-03-2018, а другой с 20-03-2018. Сначала я попытался это объединить с подзапросом:
SELECT *
, news.date AS newsletter_date
FROM products
JOIN
( SELECT newsletter_products.*
FROM newsletter_products
WHERE newsletters.date BETWEEN '2018-01-03' AND '2018-01-20'
) news
ON products.id = news.product_id
Но это объединение приводит к продукту с идентификатором, который совпадает с теми информационными бюллетенями в подзапросе, а не в product_id
, как я ожидал из подзапроса. Я использую рубин на рельсах и Mysql. Моя идея состоит в том, чтобы использовать результаты этого запроса, чтобы просто сделать ruby products.group_by(&:newsletter_date)
и получить хороший хеш с датами в качестве ключей и продуктами в качестве значений, без дополнительных запросов или фильтрации для каждой даты, что является моей текущей реализацией.