首页 > 解决方案 > mySQL - 查询以获取特定列的唯一值的前 2 条记录

问题描述

我有一个记录和处理产品订单的应用程序。从最初创建订单到最终提交订单以供履行,其 1 个或多个属性可能会被 1 个或多个员工在此过程中更改 1 次或多次。我将订单号和开始订单的员工存储在一个表中,然后将所有订单的所有更改(包括开始详细信息)存储在另一个表中。像这样的东西:

订单

ORDER_ID   EMPLOYEE
1          dan
2          dan
3          fred

订单_活动

ACTIVITY_ID    ORDER_ID    UPDATER    DATE      QTY    SIZE    COLOR    STATUS
1               1          dan        1/1/2017  5      m       red      new
2               1          dan        1/3/2017  15     m       red      updated
3               1          tom        1/9/2017  15     l       red      submitted
4               2          dan        1/1/2017  25     l       blue     new
5               2          tom        1/1/2017  25     l       blue     submitted
6               3          fred       1/9/2017  15     s       red      new
7               3          fred       1/10/2017 5      l       red      updated
8               3          fred       1/11/2017 5      m        red     updated
9               3          tom        1/11/2017 5      m        red     submitted

我需要显示发起订单的员工的 2 个最新订单以及订单的属性(数量、尺寸和颜色),就像状态更改为“已提交”时一样。

如果我只需要一个订单(最近的),我想我可以使用:

SELECT 
    Orders.EMPLOYEE, 
    Order_Activity.QTY, 
    Order_Activity.SIZE,
    Order_Activity.COLOR FROM Orders 
        INNER JOIN Order_Activity 
            ON Orders.ORDER_ID = Order_Activity.ORDER_ID 
            ORDER BY Order_Activity.date DESC LIMIT 1

但是,我很难想象如何找到具有不同值的下一条记录,ORDER_ID同时将其全部保存在一个查询中。

任何人都可以帮助我进行查询以产生类似的东西(基于上面提供的数据):

ORDER_ID    EMPLOYEE    QTY    SIZE    COLOR
3           fred        5      m       red
1           dan         15     l       red

还是不能在 1 个查询中完成?

标签: mysqlsql

解决方案


您可以将内部联接与最大日期组 da order_id 的子查询一起使用

select o.ORDER_ID, o.EMPLOYEE , oa.QTY, oa.SIZE, oa.SIZE
from Orders o 
inner join  Order_Activity oa on o.ORDER_ID = oa.ORDER_ID 
inner join  (
  select  ORDER_ID, max(date) max_date
  from Order_Activity
  group by ORDER_ID 
) tt on tt.ORDER_ID = o.ORDER_ID 
    and tt.max_date = oa.date

推荐阅读