簡體   English   中英

每組前N行僅獲得1行

[英]Top N rows per group only getting 1 row

我試圖顯示每個類別的前3個(或任何數量)房屋。 頂部表示訪問量最大。 因此,如果我有一個這樣的表:

+------------+--------------------+--------+
| housing_id | category           | visits |
+------------+--------------------+--------+
|          7 | cat                |      2 |
|          8 | New Category       |      1 |
|         10 | bead and breakfast |      1 |
|         11 | bead and breakfast |      4 |
|         15 | 2                  |      3 |
|         16 | 2                  |      1 |
|         17 | New Category       |      1 |
|         18 | cat                |      1 |
+------------+--------------------+--------+

我和我想按類別選擇訪問量最高的3個住房,所以我正在這樣做。

select housing_id, category, visits
from
    (select housing_id, category, visits,
        @category_rank := if(@current_category = category, @country_rank + 1, 1) as category_rank,
        @current_category := category
    from visit_counts
    order by category, visits desc
    ) ranked
where category_rank <= 3;

我得到:

+------------+--------------------+--------+
| housing_id | category           | visits |
+------------+--------------------+--------+
|         15 | 2                  |      3 |
|         11 | bead and breakfast |      4 |
|          7 | cat                |      2 |
|          8 | New Category       |      1 |
+------------+--------------------+--------+

但我想要:

+------------+--------------------+--------+
| housing_id | category           | visits |
+------------+--------------------+--------+
|         15 | 2                  |      3 |
|         16 | 2                  |      1 |
|         11 | bead and breakfast |      4 |
|         10 | bead and breakfast |      1 |
|          7 | cat                |      2 |
|         18 | cat                |      1 |
|          8 | New Category       |      1 |
|         17 | New Category       |      1 |
+------------+--------------------+--------+

您正在使用用戶變量而未聲明它們。 另外,您應該在一個表達式中分配和讀取用戶變量,因為MySQL不能保證列評估的順序(因此賦值可能在讀取之前或之后進行)。

嘗試這個:

select housing_id, category, visits
from (
    select housing_id, category, visits,
        @category_rank := if(@current_category = category, 
                                @category_rank + 1,
                                if(@current_category := category, 1, 1)
                            ) as category_rank
    from visit_counts, (select @category_rank := 0, @current_category := null) t2
    order by category, visits desc
    ) ranked
where category_rank <= 3;

演示版

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM