【问题标题】:MySQL join based on newest row in right tableMySQL join 基于右表中的新行
【发布时间】:2016-10-10 15:52:39
【问题描述】:

我正在尝试连接 MySQL 中的两个表,并且仅显示一行,该行应该是基于日期字段的右侧表中的最新行。

用户

id    name
1     John
2     James
3     Peter

订单

id    user_id   value   order_date
1     1         35      2016-06-01
2     1         25      2016-06-05
3     1         10      2016-06-07
4     2         20      2016-06-02
5     3         18      2016-06-07

预期输出

John 10 2016-06-07
James 20 2016-06-02
Peter 18 2016-06-07

查询

select 
    name, value, order_date 
from 
    users 
left join 
    orders on users.id = orders.user_id

收到的输出

John 35 2016-06-01
John 25 2016-06-05
John 10 2016-06-07
James 20 2016-06-02
Peter 18 2016-06-07

我无法在整个查询中添加限制 1 或顺序,因为这只会返回一个整体不正确的行,因此需要如何将它添加到连接中,但我不知道如何添加?我假设某种子查询,但我是在 select 或 join 中执行子查询,还是两者兼而有之?

【问题讨论】:

    标签: mysql join sql-order-by limit


    【解决方案1】:

    如果您确定每个日期每个 user_id 只有 1 条记录

    你可以这样使用MAX()

    http://sqlfiddle.com/#!9/658ce/5

    SELECT 
        name, 
        o.value, 
        o.order_date 
    FROM users 
    LEFT JOIN
      (SELECT 
          user_id,
          MAX(order_date) max_date
       FROM orders 
       GROUP BY user_id
      ) orders
    ON users.id = orders.user_id
    LEFT JOIN
        orders o 
    ON o.user_id = orders.user_id
      AND orders.max_date = o.order_date
    

    【讨论】:

    • 好点 - 每个用户每天可能有不止一个订单,因此我认为使用日期订单,然后可能需要例如 id,因此它始终是最新条目。数据集中没有其他方法可以判断哪个是最新的,因为它是日期而不是使用的日期时间字段
    • 如果您没有包含日期​​时间的列,您将永远无法确定什么是最新记录,这只是猜测。有时id 不是你可以信任的可靠的东西。
    【解决方案2】:

    你可以试试这样的:

    select name, value, order_date 
    from users 
    left join orders o on users.id = o.user_id
    where not exists (
        select 1
        from orders o2
        where o2.user_id = o.user_id
          and o2.id > o.id
    )
    

    【讨论】:

      【解决方案3】:

      你可以使用 in (subquery for the max(order_date, user_id))

      SELECT 
      u.name
      , o.value
      , o.order_date 
      from user as u 
      inner join orders o on u.user_id = o.user_id
      and (o.user_id, o.order_date in (user_id, max(order_date) 
                                         from orders group by user_id)
      

      【讨论】:

        猜你喜欢
        • 2011-12-19
        • 2010-11-25
        • 1970-01-01
        • 2017-03-03
        • 1970-01-01
        • 2015-07-05
        • 2016-02-11
        • 2020-06-02
        • 1970-01-01
        相关资源
        最近更新 更多