2012-03-06 29 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