[英]Create a view with top N per group rows in mysql
我需要創建一個視圖,該視圖存儲另一個表中每個userId的前200行,該表具有userId作為其列之一。 找到了一種使用SELECT
用戶定義的變量執行此操作的方法,但是MySQL不允許在SELECT
使用帶有變量的視圖。
這是要在視圖中使用的SELECT
語句的一部分:
select *,@num:= if(@userId = userId, @num + 1, 1) as row_number,
@userId := userId as dummy from (SELECT @userId:=0, @num:=0) as init
是否可以將@userId
和@num
替換為函數? 類似的例子將有很大幫助!!
考慮以下...
SELECT * FROM results;
+----+------------+--------+-------+-------+
| id | discipline | member | event | value |
+----+------------+--------+-------+-------+
| 1 | 1 | 2 | 4 | 10 |
| 2 | 1 | 1 | 4 | 8 |
| 3 | 1 | 2 | 5 | 9 |
| 4 | 2 | 3 | 5 | 9 |
| 5 | 1 | 2 | 6 | 11 |
| 6 | 1 | 2 | 7 | 11 |
| 7 | 1 | 2 | 1 | 11 |
| 8 | 1 | 2 | 3 | 7 |
| 9 | 1 | 1 | 8 | 8 |
+----+------------+--------+-------+-------+
假設我想獲得每個成員的前3個“價值”結果。 如果出現平局,我將首先參加較低的“賽事” ...
SELECT x.*
, COUNT(*) rank
FROM results x
JOIN results y
ON y.member = x.member
AND (y.value > x.value OR (y.value = x.value AND y.event <= x.event))
GROUP
BY x.member
, x.value
, x.event
HAVING COUNT(*) <=3;
+----+------------+--------+-------+-------+---------+
| id | discipline | member | event | value | rank |
+----+------------+--------+-------+-------+---------+
| 2 | 1 | 1 | 4 | 8 | 1 |
| 9 | 1 | 1 | 8 | 8 | 2 |
| 7 | 1 | 2 | 1 | 11 | 1 |
| 5 | 1 | 2 | 6 | 11 | 2 |
| 6 | 1 | 2 | 7 | 11 | 3 |
| 4 | 2 | 3 | 5 | 9 | 1 |
+----+------------+--------+-------+-------+---------+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.