我需要创建一个自动在结果中添加虚拟行号的视图。这里的图完全是随机的,我要实现的是动态创建的最后一列。
> +--------+------------+-----+ > | 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表,其中的一列包含一个从一个开始的数字,然后递增到一个非常大的数字,然后NUMBERS以类似于下面的变量示例的方式联接和引用该表。
NUMBERS
您可以定义一个变量以获得伪行号功能,因为MySQL没有任何排名函数:
SELECT t.id, t.variety, @rownum := @rownum + 1 AS num FROM TABLE t, (SELECT @rownum := 0) r
SELECT @rownum := 0
r
如果这样做,将会收到1351错误,因为由于design,您无法在视图中使用变量。该错误/功能的行为记录在这里。