一尘不染

使用num_rows列创建视图-MySQL

mysql

我需要创建一个视图,该视图具有一个名为row_num的列,将在其中插入行号,就像在普通表中自动递增一样。

假设我有这个普通表:

| country | name | age | price |
--------------------------------
| US      | john | 22  | 20    |
| France  | Anne | 10  | 15    |
| Sweden  | Alex | 49  | 10    |

等等…

我要创建的视图是:

    | country | name | price | row_num |
    ------------------------------------
    | US      | john |  20   |    1    |
    | France  | Anne |  10   |    2    |
    | Sweden  | Alex |  5    |    3    |

等等…

我可以通过一次选择生成row_num:

SELECT @i:=@i+1 AS row_num, testing.country, testing.name, testing.price
FROM testing testing,(SELECT @i:=0) derivedTable
order by name

但是我的问题是将上面的查询与创建视图的查询结合起来。这是我正在尝试的组合查询:

CREATE OR REPLACE view vwx (country, name, price, num_row) AS SELECT mytable.country, mytable.name, mytable.price, @i:=@i+1 AS row_number
    FROM testing testing,(SELECT @i:=0) derivedTable
    order by name;

我收到以下错误:#1351-视图的SELECT包含变量或参数

我知道我不能在带有视图的选择内使用选择,但是我没有看到其他以我想要的方式执行此视图的方法,但是我敢肯定有一种方法可以执行此操作,但是我只是不知道怎么样。可能是函数或过程,但是我对它们真的很陌生,所以我不适应在mysql中创建函数或过程。

我希望我能说清楚自己,否则我很乐意进一步解释自己。


阅读 267

收藏
2020-05-17

共1个答案

一尘不染

我找到了一个解决方案:

首先创建一个函数:

delimiter //

CREATE FUNCTION `func_inc_var_session`() RETURNS int
    NO SQL
    NOT DETERMINISTIC
     begin
      SET @var := @var + 1;
      return @var;
     end
     //

delimiter ;

然后将@var设置为您要开始的数字。在这种情况下为零。

SET @ var = 0;

然后创建如下视图:

CREATE OR REPLACE VIEW myview (place, name, hour, price, counter) 
AS SELECT place, name, hour, price, func_inc_var_session() 
FROM yourtable
WHERE input_conditions_here;

这里的技巧是您可能会在计数器列上看到NULL。如果发生这种情况,请再次将@var设置为您的号码,然后再次执行SELECT
*,您会看到正确填充了counter列。

2020-05-17