在mysql中创建一个具有前N行的视图
我需要创建一个视图,该视图存储另一个表中每个userId的前200行,该表将userId作为其列之一。 找到了一种在在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:=
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构建视图或者使用更快的解决方案,放弃视图。