【问题标题】:sql - find users with at least 1 order AND have conditions for each order. Use count?sql - 查找至少有 1 个订单的用户,并且每个订单都有条件。使用计数?
【发布时间】:2012-02-24 17:47:44
【问题描述】:

我在 Rails 2.3 中运行 MySQL 数据库。我在此查询中与之交互的模型关联如下:

模型:用户和订单

用户有 1 封电子邮件

用户有很多订单

订单有一个创建日期

我想列出所有至少有一个订单且最新订单至少 3 个月的用户的电子邮件(假设今天是 2012 年 2 月 24 日,最后一个订单是在 2011 年 11 月 24 日或更早时间下达的)

我知道如何使用此查询获取 11 月 24 日或之前创建的订单:

SELECT * FROM orders WHERE created_at <= "2011-11-24 00:00:00.000000 -08:00"

我不知道如何找到至少有 1 个订单的用户,并且每个订单都有这些条件。

任何帮助将不胜感激!

【问题讨论】:

  • 表的定义是什么?

标签: mysql join


【解决方案1】:
SELECT users.email
FROM users
  JOIN
    ( SELECT user_id, MAX(created_at) AS created_at
      FROM orders
      GROUP BY user_id
      HAVING MAX(created_at) < CURDATE() - INTERVAL 3 MONTH
    ) AS oo
    ON oo.user_id = users.id
ORDER BY oo.created_at DESC

【讨论】:

    【解决方案2】:

    我有另一个答案。我刚刚注意到您正在使用 rails 2.3

    在那种情况下,也许:

    User.all.orders(:conditions => ["created_at > ?", Time.now - 3.months])
    

    将订单作为默认范围放在您的订单模型中,例如

    default_scope :order_by => 'created_at'
    

    语法可能需要一些工作,因为我主要使用带有 AREL 语法的 Rails 3

    【讨论】:

    • 虽然这可能会起作用,但我希望将查询严格保留为 SQL。我也不想在不需要时更改模型。
    • 没关系。不过,我仍然建议在 Rails 中执行此操作。在 Rails 应用程序中使用大量 sql 是主要的代码异味。
    【解决方案3】:
    SELECT users.email
    FROM orders, users
    WHERE orders.user_id = users.id
    AND orders.created_at < CURDATE() - INTERVAL 3 MONTH
    ORDER BY orders.created_at DESC
    

    【讨论】:

    • 谢谢,这就是我想要完成的。我在开头添加了一个 DISTINCT,因此电子邮件不会重复。
    • 实际上,这个答案是否确保所有订单都至少有 3 个月的历史?我看到来自我确定最近订购的客户的电子邮件。
    • 这看起来不正确。 &gt; 表示将选择过去 3 个月内的订单,不早于。
    猜你喜欢
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 2022-07-01
    • 1970-01-01
    相关资源
    最近更新 更多