Топ N на группу Sql проблема в MySQL - PullRequest
0 голосов
/ 20 августа 2011

Пожалуйста, у меня возникла проблема при запросе списка Top N в каждой категории из набора данных, аналогичного показанному ниже. Я видел различные темы по этому вопросу, но у меня возникла проблема с адаптацией их запроса к моей конкретной проблеме.

+----+---------------------------------+-------+
| ID | Prod                            |Cat Id |
+----+---------------------------------+-------+
|  1 |  kntrn                          |     1 |
|  2 | kntrn e                         |     1 |
|  3 | e spl                           |     1 |
|  4 | spl php                         |     1 |
|  5 | php cicarredgtal                |     1 |
|  6 | cicarredgtal servecounterstrike |     1 |
|  7 | servecounterstrike com          |     1 |
|  8 |  zlv                            |     2 |
|  9 | zlv enter                       |     2 |
| 10 | spl php                         |     2 |
+----+---------------------------------+-------+

Я хочу сгруппировать на основе этого правила (1) Выберите Top 3 Prod для каждой категории.

Обратите внимание, что top в этом смысле является одним из самых высоких показателей продукции во всех категориях.

Таким образом, для приведенного выше примера spl php является самым высоким для catID 1, потому что это происходит дважды по всей категории.

1 Ответ

1 голос
/ 20 августа 2011

Это может быть не очень красиво, но я думаю, что это будет работать:

SELECT cat_id, prod, pos FROM (
    SELECT cat_id, pos, prod, if(@last_id = cat_id, @cnt := @cnt + 1, (@cnt := 0 || @last_id := cat_id)) cnt
    FROM (
        SELECT p.cat_id, pseq.cnt pos, pseq.prod
        FROM (
            SELECT prod, count(*) cnt FROM prods GROUP BY prod ORDER BY cnt DESC
        ) pseq
        INNER JOIN prods p ON p.prod = pseq.prod
        ORDER BY cat_id, pseq.cnt DESC
    ) po
) plist
WHERE cnt <= 3;

Based on the above data, this will return:
+--------+-----------+-----+
| cat_id | prod      | pos |
+--------+-----------+-----+
|      1 | spl php   |   2 |
|      1 |  kntrn    |   1 |
|      1 | kntrn e   |   1 |
|      2 | spl php   |   2 |
|      2 |  zlv      |   1 |
|      2 | zlv enter |   1 |
+--------+-----------+-----+
...