使用列num_rows创建一个视图 - MySQL

daz*_*ito 7 mysql views

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

假设我有这个普通表:

| country | name | age | price |
--------------------------------
| US      | john | 22  | 20    |
| France  | Anne | 10  | 15    |
| Sweden  | Alex | 49  | 10    |
Run Code Online (Sandbox Code Playgroud)

等等...

我想创建的视图是:

    | country | name | price | row_num |
    ------------------------------------
    | US      | john |  20   |    1    |
    | France  | Anne |  10   |    2    |
    | Sweden  | Alex |  5    |    3    |
Run Code Online (Sandbox Code Playgroud)

等等...

我可以用一个select生成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
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

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

我知道我不能在带有视图的select中使用select但我没有看到以我想要的方式执行此视图的其他方式,但我确信有一种方法可以做到这一点但我只是不知道怎么样.可能有功能或程序,但我真的很新,所以我不习惯在mysql中创建函数或过程.

我希望自己明确表示,否则我非常乐意更详细地解释自己.

小智 6

我尝试了该func_inc_var_session函数的示例。

有一个会话变量初始化的小问题,我使用mysqlIFNULL函数解决了。

下面是增强func_inc_var_session功能。

CREATE DEFINER=`root`@`localhost` FUNCTION `func_inc_var_session`() RETURNS int(11)
begin
  SET @var := IFNULL(@var,0) + 1;
  return @var;
end
Run Code Online (Sandbox Code Playgroud)

  • 请注意警告:如果您在单个查询中使用该函数两次或更多次(例如使用 JOIN),它将继续增加变量。 (2认同)

daz*_*ito 5

我找到了一个解决方案:

首先创建一个函数:

delimiter //

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

delimiter ;
Run Code Online (Sandbox Code Playgroud)

然后将@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;
Run Code Online (Sandbox Code Playgroud)

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