繁体   English   中英

MYSQL-获取用户和最新购买数据

[英]MYSQL - Get User and Most Recent Purchase Data

我正在尝试进行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金额与最大日期不在同一行。 我如何重写此查询以提供完整的最新购买记录?

谢谢!

您必须再次加入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

由于您在此选择中的分组

如果您需要重写max(date)的数量以保护适当的数量

  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

您可以试试这个,伙计:

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降序users_purchases date

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM