如何有条件地联接并从联接表中获取数据?

米拉巴卡

我有两个表,ProductProductNewsletter一个产品可以有多个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之间的用户应两次显示此产品,一次是2018年3月11日,另一次是2018年3月20日。最初,我尝试使用子查询进行此联接:

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

但是,这种连接产生的产品ID与子查询中的新闻稿相同,而不是product_id我期望的子查询中的新闻稿我在Rails和Mysql上使用ruby。我的想法是使用此查询的结果简单地进行红宝石处理products.group_by(&:newsletter_date),最后得到一个很好的哈希,将日期作为键,将产品作为值,而无需对每个日期进行额外的查询或过滤,这是我当前的实现。

射线

以下将为您提供预期的输出,

Product.joins(:product_newsletters).where(product_newsletters: { date: ['19-01-2013'.to_datetime..'19-02-2013'.to_datetime] })

如果2个product_newsletters对象属于日期范围,并且两个对象都具有相同的product_id,则对于上述查询,您仍将获得2 counts相同的产品ID。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章