在mysql中创建一个具有前N行的视图

在mysql中创建一个具有前N行的视图,mysql,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:=

我需要创建一个视图,该视图存储另一个表中每个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 |
+----+------------+--------+-------+-------+---------+
选择x*
,COUNT(*)秩
根据结果x
连接结果y
在y.member=x.member上

和(y.value>x.value或(y.value=x.value和y.event)是的,您可以-但速度会慢一些:-(此解决方案有效,但正如您所提到的,它非常慢,尤其是因为我的表中有数千条记录。使用用户定义变量的方法工作得非常快。是否有一种方法可以在视图中使用函数代替变量来使用变量方法。不,我不这样认为。或者,使用me构建视图或者使用更快的解决方案,放弃视图。