我需要创建一个视图,该视图具有一个名为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中创建函数或过程。
我希望我能说清楚自己,否则我很乐意进一步解释自己。
我找到了一个解决方案:
首先创建一个函数:
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列。