从max列与MySQL中的多个表获取关联数据

时间:2018-08-24 01:19:23

标签: mysql sql

我有两个表,Orders和OrderDetails。我想创建一个SQL查询,以检索每个用户具有最新处理的T恤的订单的OrderID,单价和处理日期。

我在此SQL fiddle中创建了一个非常简化的表版本。

从我的Google搜索中,大多数搜索都以SO结尾,我设法弄清楚了SQL以获取每个订单最新处理的T恤订单的相关单位成本,但是我不确定如何从这里进一步浓缩为每个用户,并仍然保持正确的单位成本和处理日期。我知道我不能使用MAXGROUP BY,并且在{时,我无法解决如何做LEFT OUTER JOIN(就像我在SQL提琴的第一部分一样)。 {1}}和UserID位于不同的表中。

对于SQL小提琴中的数据集,我想要的输出将是

ProcessDate

2 个答案:

答案 0 :(得分:1)

上面的查询输出非常好,只是每当每一行都执行相关子查询时,这是相当大的开销,并且在大数据的情况下会出现性能问题。

我已将子查询更改为join,这可能会有所帮助。

SELECT O.UserID
     , O.OrderID
     , OD.UnitCost
     , OD.ProcessDate
  FROM Orders O 
  left 
  JOIN OrderDetails OD 
   ON O.OrderID = OD.OrderID 
  left 
  join 
     ( SELECT o2.userid
           , max(od2.processdate) newdate 
        FROM Orders o2 
        JOIN OrderDetails od2
          ON o2.OrderId = od2.OrderId
       WHERE od2.Product = 'T-Shirts' 
       group 
          by o2.userid
     ) temp
    on O.userid = temp.userid
 WHERE OD.Product = 'T-Shirts' 
   and OD.processdate = temp.newdate
 ORDER 
    BY OD.OrderDetailID;

希望有帮助。

答案 1 :(得分:0)

您可以使用相关子查询为每个用户选择“最新”顺序:

SELECT O.UserID, O.OrderID, OD.UnitCost, OD.ProcessDate
FROM OrderDetails OD LEFT JOIN
     Orders O
     ON O.OrderID = OD.OrderID
WHERE OD.Product = 'T-Shirts' AND
      o.OrderID = (SELECT MAX(o2.OrderId)
                   FROM Orders o2
                   WHERE o2.UserID = o.UserID
                  )
ORDER BY OD.OrderDetailID;

这假设最新的订单是OrderId最大的订单。

编辑:

实际上,以上情况对您的数据起作用,因为每个用户的最大订单ID是T恤衫。但是,您明确表示要获得最新的T恤订单,因此需要稍作修改:

SELECT O.UserID, O.OrderID, OD.UnitCost, OD.ProcessDate
FROM Orders O LEFT JOIN
     OrderDetails OD 
     ON O.OrderID = OD.OrderID
WHERE OD.Product = 'T-Shirts' AND
      o.OrderID = (SELECT MAX(o2.OrderId)
                   FROM Orders o2 JOIN
                        OrderDetails od2
                        ON o2.OrderId = od2.OrderId
                   WHERE od2.Product = 'T-Shirts' AND
                         o2.UserID = o.UserID
                  )
ORDER BY OD.OrderDetailID;

或者,如果您想按处理日期进行:

SELECT O.UserID, O.OrderID, OD.UnitCost, OD.ProcessDate
FROM Orders O LEFT JOIN
     OrderDetails OD 
     ON O.OrderID = OD.OrderID
WHERE OD.Product = 'T-Shirts' AND
      od.ProcessDate = (SELECT od2.ProcessDate
                        FROM Orders o2 JOIN
                             OrderDetails od2
                             ON o2.OrderId = od2.OrderId
                        WHERE od2.Product = 'T-Shirts' AND
                              o2.UserID = o.UserID
                        ORDER BY od2.ProcessDate DESC
                        LIMIT 1
                       )
ORDER BY OD.OrderDetailID;