9

我需要创建一个自动在结果中添加虚拟行号的视图。这里的图表是完全随机的,我想要实现的只是动态创建的最后一列。

> +--------+------------+-----+
> | 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
4

2 回答 2

17

采用:

SELECT t.id,
       t.variety,
       (SELECT COUNT(*) FROM TABLE WHERE id < t.id) +1 AS NUM
  FROM TABLE t

这不是执行此操作的理想方式,因为对于返回的每一行都会执行对 num 值的查询。一个更好的想法是创建一个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 错误,因为由于设计原因,您不能在视图中使用变量。此处记录了错误/功能行为

于 2009-12-27T01:15:34.843 回答
4

Oracle 有一个 rowid 伪列。在 MySQL 中,你可能不得不变得丑陋:

SELECT id,
       variety,
       1 + (SELECT COUNT(*) FROM tbl WHERE t.id < id) as num
  FROM tbl

这个查询不在我的脑海中并且未经测试,因此请谨慎对待。此外,它假设您希望根据某种排序标准(在本例中为 id)对行进行编号,而不是问题中显示的任意编号。

于 2009-12-27T01:02:49.147 回答