题
我需要建立一个看法,即自动增加了虚拟的行号的结果。图在这里是完全随机的一切,我想要实现的是最后一栏是创造的动态。
> +--------+------------+-----+
> | 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
这不是一个理想的方式这样做,因为所查询的数值将执行每一行返回。一个更好的主意就是创建一个 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错误的,因为 你不能用一个变量视由于设计.的 错误/特征的行为被记录在这里.
其他提示
Oracle有一个rowid伪列。在MySQL中,你可能需要去丑:
SELECT id,
variety,
1 + (SELECT COUNT(*) FROM tbl WHERE t.id < id) as num
FROM tbl
此查询是我的头和未经试验的顶部,所以把它与一粒盐。此外,它假定要编号的行按照某种准则(ID在这种情况下),而不是在问题中示出的任意编号。
不隶属于 StackOverflow