我有两个表,Orders和OrderDetails。我想创建一个SQL查询,以检索每个用户具有最新处理的T恤的订单的OrderID,单价和处理日期。
我在此SQL fiddle中创建了一个非常简化的表版本。
从我的Google搜索中,大多数搜索都以SO结尾,我设法弄清楚了SQL以获取每个订单最新处理的T恤订单的相关单位成本,但是我不确定如何从这里进一步浓缩为每个用户,并仍然保持正确的单位成本和处理日期。我知道我不能使用MAX
和GROUP BY
,并且在{时,我无法解决如何做LEFT OUTER JOIN
(就像我在SQL提琴的第一部分一样)。 {1}}和UserID
位于不同的表中。
对于SQL小提琴中的数据集,我想要的输出将是
ProcessDate
答案 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;