一尘不染

MySQL视图中的行排名

mysql

我需要创建一个自动在结果中添加虚拟行号的视图。这里的图完全是随机的,我要实现的是动态创建的最后一列。

> +--------+------------+-----+
> | id     | variety    | num |
> +--------+------------+-----+
> | 234    | fuji       |   1 |
> | 4356   | gala       |   2 |
> | 343245 | limbertwig |   3 |
> | 224    | bing       |   4 |
> | 4545   | chelan     |   5 |
> | 3455   | navel      |   6 |
> | 4534345| valencia   |   7 |
> | 3451   | bartlett   |   8 |
> | 3452   | bradford   |   9 |
> +--------+------------+-----+

查询:

SELECT id, 
       variety, 
       SOMEFUNCTIONTHATWOULDGENERATETHIS() AS num 
  FROM mytable

阅读 455

收藏
2020-05-17

共1个答案

一尘不染

采用:

SELECT t.id,
       t.variety,
       (SELECT COUNT(*) FROM TABLE WHERE id < t.id) +1 AS NUM
  FROM TABLE t

这不是理想的方式,因为将对返回的每一行执行num值查询。更好的主意是创建一个NUMBERS表,其中的一列包含一个从一个开始的数字,然后递增到一个非常大的数字,然后NUMBERS以类似于下面的变量示例的方式联接和引用该表。

MySQL排名,或缺乏

您可以定义一个变量以获得伪行号功能,因为MySQL没有任何排名函数:

SELECT t.id,
       t.variety,
       @rownum := @rownum + 1 AS num
  FROM TABLE t,
       (SELECT @rownum := 0) r
  • SELECT @rownum := 0定义了变量,并将其设置到零。
  • r是一个子查询/表别名,因为如果不为子查询定义别名,即使不使用别名,也会在MySQL中出错。

在MySQL视图中不能使用变量

如果这样做,将会收到1351错误,因为由于design您无法在视图中使用变量。该错误/功能的行为记录在这里

2020-05-17