如何在MySQL视图中生成序列号?

时间:2017-02-03 09:40:26

标签: mysql

我在Linux下使用MySQL 5.6。

我有一个表让用户输入一个from-number和一个to-number。

然后,有一个视图从另一个表中选择一些记录,其中包含from-number和to-number之间的帐号。

最困难的问题是用户想要视图中每个记录的SEQUENCE编号,从1开始。例如,如果视图显示37行,则序列号应从1,2,3开始...直到37,没有跳数。视图的排序顺序并不重要。

我知道MySQL表中有自动增量列。但是,对于我的情况,我必须使用VIEW,而不是表格。

有谁知道怎么做?

BTW,我必须使用VIEW这样做,而不是SELECT语句。用户不知道如何输入SELECT语句,但他们知道如何单击视图来查看视图。

2 个答案:

答案 0 :(得分:1)

  

BTW,我必须使用VIEW这样做,而不是SELECT语句。用户呢   不知道如何输入SELECT语句,但是他们知道如何点击   查看视图。

从技术上讲,你想要这样的东西来模拟排名或行号。

CREATE VIEW table_view 
AS
 SELECT
  *
  , (@row_number := @row_number + 1) AS row_number 
 FROM 
  table
 # Because a SQL table is a unsorted set off data ORDER BY is needed to get stabile ordered results.
 ORDER BY
  table.column ASC 
CROSS JOIN (SELECT @row_number := 0) AS init_user_var  

如果您尝试使用用户变量创建视图,则无法使用此SQL代码,您将收到以下错误。

Error Code: 1351
View's SELECT contains a variable or parameter

下面的SQL代码也可以生成row_number。 这假设您有一个使用AUTO_INCREMENT生成的id列。 但子查询是一个相关的子查询,因为计数需要在每个记录上执行,因此在大型表上执行的速度非常慢。

CREATE VIEW table_view
AS
 SELECT 
  *
  , (SELECT COUNT(*) + 1 FROM table inner WHERE inner.id < outer.id) AS row_number
 FROM 
   table outer

MySQL 8.0+ Only。

MySQL支持窗口函数,因此不需要MySQL的用户变量来模拟排名或行号。

CREATE VIEW table_view 
AS
 SELECT
  *
 # Because a SQL table is a unsorted set off data ORDER BY is needed to get stabile ordered results.
  , (ROW_NUMBER() OVER (ORDER BY table.column ASC)) AS row_number
 FROM 
  table

答案 1 :(得分:0)

Yon可以查看this question以及我在此报告的答案:

  

MySQL中没有排名功能。你能得到的最接近的是   使用变量:

SELECT t.*, 
       @rownum := @rownum + 1 AS rank
  FROM YOUR_TABLE t, 
       (SELECT @rownum := 0) r

通过这种方式,您可以为结果添加行计数器。