[英]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.