2012-03-06 5 views
0

У меня есть таблица заказов. Каждый заказ связан с одним или несколькими элементами корзины.Как получить последние 5 уникальных идентификаторов продукта?

Базовый код:

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

проблема заключается в том, что 'GROUP BY' каким-то образом выполняется перед' ORDER BY' происходит. – vulkanino

+0

см. Мои изменения в ответе. – vulkanino

ответ

1

Try:

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

Умный! Спасибо :) – thirtyish

1

USE `

GROUP BY изделия для заказа Заказ DESC LIMIT 5

`

+0

Это похоже на работу, если это небольшой набор данных, но не работает для реальных данных, которые я использую. Я обновлю данные примера, которые я включил выше, и повторите попытку. – thirtyish

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 идентификаторов продукта. Я обновил данные, поэтому в списке осталось меньше 10, иначе GROUP BY работает в некоторых случаях. – thirtyish

+0

«ORDER BY Order DESC LIMIT 5' работает должным образом? – sll

0

EDIT: проблема в том, что 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

Смежные вопросы