我在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语句,但他们知道如何单击视图来查看视图。
答案 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
通过这种方式,您可以为结果添加行计数器。