【问题标题】:mySQL - query to fetch first 2 records with unique values for specific columnmySQL - 查询以获取特定列的唯一值的前 2 条记录
【发布时间】:2019-02-07 19:24:19
【问题描述】:

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

订单

ORDER_ID   EMPLOYEE
1          dan
2          dan
3          fred

Order_Activity

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 个订单以及订单的属性(数量、尺寸和颜色),就像状态更改为“已提交”时一样。

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

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 个查询中完成?

【问题讨论】:

  • 在 MS SQL 中我应该告诉你下一个查询:

标签: mysql sql


【解决方案1】:

您可以对 max date group 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

【讨论】:

  • 我必须按日期降序排序并将行数限制为 2,但这成功了。谢谢!!
【解决方案2】:

如果你有 MS SQL,那么我应该告诉你下一个查询:

WITH prepare AS
(
SELECT 
     Orders.EMPLOYEE
    , Order_Activity.QTY
    , Order_Activity.SIZE
    , Order_Activity.COLOR
    , ROW_NUMBER() OVER (PARTITION BY Orders.ORDER_ID ORDER BY Order_Activity."date") AS rnbr
FROM Orders 
        INNER JOIN Order_Activity 
            ON Orders.ORDER_ID = Order_Activity.ORDER_ID 
)
SELECT

prepare.EMPLOYEE
, prepare.QTY
, prepare.SIZE
, prepare.COLOR

FROM prepare
WHERE prepare.nmbr = 1

您可以在 My SQL 中尝试此语句,因为此查询执行标准 SQL。

【讨论】:

    猜你喜欢
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 2016-04-05
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多