[英]Top N per Group Sql problem in mysql
請問我在從類似於以下所示的數據集中查詢每個類別的前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)為每個catid選擇Top 3 Prod。
請注意,從這個意義上講,top是所有類別中最高的產品數。
因此,對於上面的示例,spl php對於catID 1最高,因為它在所有類別中都出現兩次。
這可能不是很漂亮,但我認為它會起作用:
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 |
+--------+-----------+-----+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.