【问题标题】:MYSQL - Get User and Most Recent Purchase DataMYSQL - 获取用户和最近的购买数据
【发布时间】:2017-04-04 06:39:58
【问题描述】:

我正在尝试执行 MYSQL 查询,在其中获取用户最近的购买记录,然后查看是否符合特定条件。这是我放在一起的查询:

select
    users_purch.purch_date as purchase_date,
    users_purch.total_amount as purchase_amount,
    users.* 
from
    users 
left join
    (
        select
            max(date) as purch_date,
            user_id,
            total_amount 
        from
            users_purchases 
        group by
            user_id
    ) as users_purch 
        on users_purch.user_id = users.id 
where
    users_purch.purch_date < '2016-11-01' 
    and users_purch.total_cost < 112.49 
order by
    users_purch.purch_date desc

查询似乎有效,但在某些方面失败了。例如,如果用户有多个购买条目,则它会获取最大日期,但查询检索到的 total_cost 金额与最大日期不在同一行。如何重写此查询以提供最新的完整购买记录?

谢谢!

【问题讨论】:

  • 发布您的表格概览会有所帮助。我们可以根据表格布局(也许)为您提供一些关于查询的新见解
  • 您的内部查询 users_purch 似乎是错误的。是total_amountsum(amount)??您的 Group by 只有一列,但您在 select 中有 2 列以及一个聚合函数
  • 这和php标签有什么关系?
  • 请注意,LEFT JOIN 在此处作为常规 INNER JOIN 执行,这要归功于 WHERE 子句条件。
  • 感谢大家的cmets。很有帮助!

标签: php mysql sql database


【解决方案1】:

您必须再次加入user_purchases 表才能获取有关日期的信息:

select
    users_purch.purch_date as purchase_date,
    users_purch.total_amount as purchase_amount,
    users.* 
from
    users 
left join
    (
        select
            max(date) as purch_date,
            user_id
        from
            users_purchases 
        group by
            user_id
    ) as users_purch 
        on users_purch.user_id = users.id 
left join
   (
       select
          user_id,
          date,
          total_amount
       from
          users_purchases
   ) as users_purch2 on users_purch.user_id = users_purch2.user_id and
        users_purch2.date = users_purch.purch_date
where
    users_purch.purch_date < '2016-11-01' 
    and users_purch.total_cost < 112.49 
order by
    users_purch.purch_date desc

【讨论】:

  • 非常感谢。这工作得很好。我知道我必须重新加入那张桌子,但我一生都无法弄清楚如何去做。看了这个之后,我想知道从“users_purch”中获取ID并在与“users_purch2”的连接中使用它是否是一个更强大的连接?
  • @ackerchez 如果您尝试获取ID 值,那么您基本上会遇到同样的问题:获得的ID不能保证是那个值对应于最新的日期值。
  • 我明白了。所以只要我没有在同一秒购买两次(似乎不可能)并且由同一个用户购买,那么我应该没问题。
  • @ackerchez 是的,在这种情况下,关键是用户、日期值对。
【解决方案2】:

由于您在此选择中的分组

如果您需要最大(日期)的数量,则重写以提取适当的数量

  select
      users_purch.purch_date as purchase_date,
      users_purch.total_amount as purchase_amount,
      users.* 
  from
      users 
  left join
      (
        select t1.purch_date, t1.user_id, t2.total_amount from (
         select
                max(date) as purch_date,
                user_id
          from  users_purchases 
            group by  user_id ) t1
            inner join (
              date,
              user_id,
              total_amount 
          from users_purchases 
              ) t2 on t1.user_id= t2.user_id, t1.purch_date = t2.date

      ) as users_purch 
          on users_purch.user_id = users.id 
  where
      users_purch.purch_date < '2016-11-01' 
      and users_purch.total_cost < 112.49 
  order by
      users_purch.purch_date desc

【讨论】:

    【解决方案3】:

    你可以试试这个,伙计:

    SELECT
        up.date AS 'purchase_date', 
        up.total_amount AS 'purchase_amount',
        u.*
    FROM 
        users u
        INNER JOIN users_purchases up ON up.user_id = u.user_id
        INNER JOIN (
            # get max date per user_id
            SELECT user_id, max(date) AS 'purch_date'
            FROM users_purchases 
            GROUP BY user_id
        ) max_up ON 
            max_up.user_id
            # join that date to get the correct total_amount
            AND max_up.`purch_date` = up.`date`
    WHERE 
        up.`date` < '2016-11-01'
        AND up.total_amount < 112.49
    GROUP BY u.user_id
    ORDER BY up.`date` DESC;
    

    注意

    • user_id 的最大日期
    • total_amount 每个最大日期的值
    • user_id 分组
    • 使用users_purchases.date 降序排列

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-16
      • 2021-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多