我有一张订单表。每个订单都链接到一个或多个购物篮。
基本代码:
SELECT * FROM Orders o JOIN OrderItems oi ON o.OrderNumber = oi.OrderNumber
我可以通过这样做限制最后5个项目:
ORDER BY oi.CreatedDate DESC LIMIT 5
但是,在某些情况下,用户已在同一产品中下了多个订单。 e.g。
OrderNo ItemNo ProductId
1 1 70
1 2 20
2 1 80
2 2 30
3 1 10
4 1 90
5 1 10
6 1 40
7 1 50
8 1 100
9 1 10
10 1 30
11 1 10
12 1 60
如果我得到最后五项,我最终会得到60分,10分,30分,10分,100分。我真正想要的是获得最后5个唯一的产品ID - 这样就是60,10, 30,100,50。这会是什么SQL?
被修改
如果我使用GROUP BY,我会得到60,100,50,40,90。哪里有30?
答案 0 :(得分:1)
USE`
GROUP BY产品订单按订单DESC限制5
`
答案 1 :(得分:1)
只需添加GROUP BY Product
SELECT *
FROM Orders o
JOIN OrderItems oi ON o.OrderNumber = oi.OrderNumber
GROUP BY o.Product
ORDER BY oi.CreatedDate DESC LIMIT 5
答案 2 :(得分:1)
尝试:
select ProductID from
(select ProductID, max(OrderNo)
from Orders
group by ProductID
order by 2 desc) sq
limit 5
答案 3 :(得分:0)
编辑:问题是MySql在group by
之前order by
。欺骗它的诀窍是:
SELECT * FROM
(
SELECT
O.OrderNumber,
oi.ItemNo,
oi.Productid
FROM
orders o
JOIN
OrderItems oi ON o.OrderNumber = oi.OrderNumber
ORDER BY
oi.CreateDate DESC
) AS fool_mysql
GROUP BY
ProductId
LIMIT 5;
也就是说,在分组之前进行排序。