2016-06-20 3 views
0

я в настоящее время есть запрос, аналогичный:MySQL использовать DISTINCT с GROUP BY на той же колонке

select customers.customerId, items.itemName, sum(orders.quantity) as boughtTotal 
from customers join orders on customers.customerId = orders.customerId 
join items on items.itemId = orders.itemId 
group by customers.customerId, items.itemName 
order by boughtTotal desc; 

Цель запроса связать клиентам предметов, которые они купили, которые могут охватывать более много заказов, и общая количество каждого уникального предмета, купленного. Это достигается тем, что у меня есть. Я хочу сделать этот шаг дальше и выбрать наиболее популярный элемент для каждого клиента. Поскольку это упорядочено с большинством купленных предметов наверху, я решил, что просто должен добавить distinct рядом с customers.customerId в операторе select, чтобы удалить дубликаты. Однако, добавление distinct, кажется, ничего не делает. Я был бы признателен за помощь в понимании того, почему distinct, похоже, ничего не делает здесь, но также и как добиться того, что я пытаюсь сделать - удалить дубликаты, кроме самого популярного элемента клиента.

Таблицы:

customers 
customerId | name 
     1  | John 
     2  | Jane 

orders 
orderId | customerId | quantity | itemId 
    1 |  1  | 11 | 1 
    2 |  2  | 13 | 2 
    3 |  1  | 4  | 2 
    4 |  2  | 14 | 1 
    5 |  1  | 1  | 1 

items 
itemId | itemName 
    1 | dog 
    2 | cat 

Так из этих данных, текущий запрос будет возвращать следующие:

customerId | itemName | boughtTotal 
     2  | dog |  14 
     2  | cat |  13 
     1  | dog |  12 
     1  | cat |  4 

И что я хотел бы иметь следующий:

customerId | itemName | boughtTotal 
     2  | dog |  14 
     1  | dog |  12 
+0

добавить еще одно условие ON в РЕГИСТРИРУЙТЕСЬ – Sinto

+0

В результирующий набор, две линии для клиента 2 различны, и поэтому «отчетливый» ничего не делает. Запрос, который вы написали, не даст вам желаемого результата, как вы обнаружили. –

+0

Используйте предложение 'having' вместе с подзапросом, который выбирает запись максимального количества. – CuriousMind

ответ

1

Попробуйте это;)

select t1.* 
from (
    select customers.customerId, items.itemName, sum(orders.quantity) as boughtTotal 
    from customers join orders on customers.customerId = orders.customerId 
    join items on items.itemId = orders.itemId 
    group by customers.customerId, items.itemName) t1 
inner join (
    select max(boughtTotal) as boughtTotal, customerId 
    from (
     select customers.customerId, items.itemName, sum(orders.quantity) as boughtTotal 
     from customers join orders on customers.customerId = orders.customerId 
     join items on items.itemId = orders.itemId 
     group by customers.customerId, items.itemName)t 
    group by customerId) t2 on t1.customerId = t2.customerId and t1.boughtTotal = t2.boughtTotal 

DEMO HERE

+0

Я действительно не могу поблагодарить вас за это. Работал как шарм. Думаю, я думал, что будет более простой способ сделать это и избежать использования подзапроса. – yanman1234

+0

Я не думаю, что есть способ достичь этого без какого-либо подзапроса, но этот запрос можно оптимизировать, чтобы быть более простым. – Blank

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