2012-03-06 75 views
0

我有一个订单表。每个订单都链接到一个或多个购物篮项目。如何获取最后5个唯一的产品ID?

Basic代码:

SELECT * FROM Orders o JOIN OrderItems oi ON o.OrderNumber = oi.OrderNumber 

我可以做这个限制的最后5个项目:

ORDER BY oi.CreatedDate DESC LIMIT 5 

然而,在某些情况下,用户已经横放在同一产品的多个订单。例如

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个独特的产品标识 - 这样会是60,10,30,100,50.这是什么SQL?

编辑

如果我使用GROUP BY我得到60,100,50,40,90哪里是30?

+0

的问题是,'ORDER BY'发生之前'集团BY'以某种方式执行。 – vulkanino 2012-03-06 12:50:53

+0

请看我对答案的修改。 – vulkanino 2012-03-06 13:04:33

回答

1

尝试:

select ProductID from 
(select ProductID, max(OrderNo) 
from Orders 
group by ProductID 
order by 2 desc) sq 
limit 5 
+0

聪明!谢谢 :) – thirtyish 2012-03-06 13:05:10

1

使用`

GROUP BY产品ORDER BY订单DESC LIMIT 5

`

+0

这似乎工作,如果它是一个小数据集,但不适用于我使用的真实数据。我会更新上面包含的示例数据,然后重试。 – thirtyish 2012-03-06 12:09:43

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 
+0

如果我这样做,我会得到60,100,50,40,90。这不是最后5个产品ID。我更新了数据,因此列表中的数量少于10个,否则GROUP BY在某些情况下可以工作。 – thirtyish 2012-03-06 12:13:05

+0

'订单降序限制5'是否按预期工作? – sll 2012-03-06 12:17:06

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; 

也就是说,在分组之前进行排序。

+0

谢谢,但即使使用DISTINCT和GROUP BY,我也会得到60,100,50,40,90。我预计30名会出现在列表中,因为它出现在表格底部的第三位。 – thirtyish 2012-03-06 12:19:19