2009-03-25 11 views
0

は、だから私は、例の表には、次の列でアイテムと呼ばれています:のMySQL:複数のグループ化

  • は(int型)をITEM_ID
  • (int)をPERSON_ID
  • ITEM_NAME( varchar)
  • item_type(varchar) - 例: "ne WS」、 "イベント"、 "ドキュメント"
  • item_date(日時)

...と、次の列を持つテーブル: "PERSON_ID"、 "人名"。

私はに、各item_typeの所定の期間内に投稿者の上位2名(+ COUNT(件)のアイテムのリスト)を表示したいと考えていました。基本的には、MySQLの出力が次のようになることを期待していました。

person_name | item_type | item_count 

Steve Jobs | document | 11 
Bill Gates | document | 6 
John Doe  | event  | 4 
John Smith | event  | 2 
Bill Jones | news  | 24 
Bill Nye  | news  | 21 

item_typeごとに別のクエリを作成しなければ、これはどうして可能ですか?前もって感謝します!

私は、これはそれを行うべきだと思う

答えて

2
SELECT item_type, person_name, item_count 
FROM (
     SELECT item_type, person_name, item_count, 
       @r := IFNULL(@r, 0) + 1 AS rc, 
       CASE WHEN @_item_type IS NULL OR @_item_type <> item_type THEN @r := 0 ELSE 1 END, 
       @_item_type := item_type, 
     FROM (
       SELECT @r := 0, 
         @_item_type := NULL 
       ) vars, 
       (
       SELECT item_type, person_name, COUNT(*) AS item_count 
       FROM items 
       GROUP BY 
         item_type, person_name 
       ORDER BY 
         item_type, person_name, item_count DESC 
       ) vo 
     ) voi 
WHERE rc < 3 
+0

どのように効率的ですか? – Matt

+0

より効率的です。たくさんの(item_type、person_name)のペアがある場合、それは顕著に効率的です。 – Quassnoi

+0

あなたが実際に持っているitem_typeの数にもよりますが、通常はデータベースへの1回の旅行をお勧めします。このクエリは、リソースをあまり必要としないようです。 –

1

SELECT person_name,item_type,count(item_id) AS item_count 
FROM person 
LEFT JOIN items USING person_id 
GROUP BY person_id 

「ITEM_TYPE」欄がが危険なことになるだろう、各行は複数の項目を表し、そしてあなただけの1からITEM_TYPEを見せていますそれら。あなたは "GROUP_CONCAT"でそれらのすべてをリストすることができます、それは多くの楽しみです。このshoulの作品のような

+0

あなたはグルーピングしているだけですが、彼は各item_typeからトップ2の投稿者しか必要としません。 – Seb

+0

ああ、各カテゴリのトップ2についての部分は見ませんでした。 – GoatRider

1

何か:各ITEM_TYPEに別々のクエリを使用するのではなく

SELECT 
    p.person_name, i.item_type, COUNT(1) AS item_count 
FROM 
    person p 
    LEFT JOIN item i 
    ON p.person_id = i.person_id 
GROUP BY 
    p.person_id, 
    i.item_type 
HAVING 
    COUNT(1) >= (
    SELECT 
     COUNT(1) 
    FROM 
     item i2 
    WHERE 
     i2.item_type = i.item_type 
    GROUP BY 
     i2.person_id 
    LIMIT 1,1 
) 
+0

は機能しません。一部のイベントタイプでは、このタイプのイベントがさらに存在する場合でもトップ送信者が1つだけ戻ります。 –