我需要创建一个自动在结果中添加虚拟行号的 View 。这里的图表是完全随机的,我想要实现的是动态创建的最后一列。
> +--------+------------+-----+
> | 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
最佳答案
使用:
SELECT t.id,
t.variety,
(SELECT COUNT(*) FROM TABLE WHERE id < t.id) +1 AS NUM
FROM TABLE t
这不是执行此操作的理想方式,因为对 num 值的查询将针对返回的每一行执行。一个更好的主意是创建一个 NUMBERS
表,其中包含一个从 1 开始递增到一个非常大的数字的单列,然后加入并引用 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 View 中使用变量
如果这样做,您将收到 1351 错误,因为 you can't use a variable in a view due to design . bug/feature behavior is documented here .
关于sql - MySQL View 中的行排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1964811/