2016-06-20 5 views
0

同じ列にGROUP BYとDISTINCTを使用しますユニークなアイテムの購入額これは私が持っているもので達成されます。私はこれを一歩一歩踏み出し、各顧客に最も人気のあるアイテムを選択したいと考えています。これは一番上に購入したアイテムが多い順に並べられているので、の隣にcustomers.customerIdを追加して、selectのステートメントに重複を削除しなければならないと考えました。しかし、distinctを追加すると何もしないようです。 distinctがここで何もしていない理由を知ってくれて助けてくれてありがたく思っていますが、私がやろうとしていることを達成する方法もあります。MySQLは、私が現在と同様のクエリを持って

テーブル:

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

結果セットで – Sinto

+0

のJOIN ONに1つの以上の条件を追加し、顧客2のための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

関連する問題