我需要创建一个自动在结果中添加虚拟行号的视图。这里的图形是完全随机的,我想要实现的是动态创建的最后一列。
> +--------+------------+-----+
> | 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
答案 0 :(得分:17)
使用:
SELECT t.id,
t.variety,
(SELECT COUNT(*) FROM TABLE WHERE id < t.id) +1 AS NUM
FROM TABLE t
执行此操作并不理想,因为num值的查询将针对返回的每一行执行。更好的想法是创建一个NUMBERS
表,其中一个列包含从1开始的数字,该数字增加到一个非常大的数字,然后加入&amp;以类似于后面的变量示例的方式引用NUMBERS
表。
您可以定义一个变量以获取伪行号功能,因为MySQL没有任何排名功能:
SELECT t.id,
t.variety,
@rownum := @rownum + 1 AS num
FROM TABLE t,
(SELECT @rownum := 0) r
SELECT @rownum := 0
定义变量,并将其设置为零。 r
是子查询/表别名,因为如果您没有为子查询定义别名,即使您不使用它,也会在MySQL中出现错误。如果这样做,您将收到1351错误,因为you can't use a variable in a view due to design。 bug/feature behavior is documented here。
答案 1 :(得分:4)
Oracle有一个rowid伪列。在MySQL中,你可能不得不丑陋:
SELECT id,
variety,
1 + (SELECT COUNT(*) FROM tbl WHERE t.id < id) as num
FROM tbl
这个问题不在我的脑海中且未经测试,所以请耐心等待。此外,它假定您要根据某些排序条件(在本例中为id)对行进行编号,而不是问题中显示的任意编号。