我需要建立一个看法,即自动增加了虚拟的行号的结果。图在这里是完全随机的一切,我想要实现的是最后一栏是创造的动态。

> +--------+------------+-----+
> | 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在这种情况下),而不是在问题中示出的任意编号。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top