我可以用MySQL中的参数创build视图吗?

我有这样的看法:

CREATE VIEW MyView AS SELECT Column FROM Table WHERE Value = 2; 

我想使它更通用,这意味着将2变成一个variables。 我试过这个:

 CREATE VIEW MyView AS SELECT Column FROM Table WHERE Value = @MyVariable; 

但是mysql不允许这样做。

我发现了一个丑陋的解决方法:

 CREATE FUNCTION GetMyVariable() RETURNS INTEGER DETERMINISTIC NO SQL BEGIN RETURN @MyVariable; END| And then view is: CREATE VIEW MyView AS SELECT Column FROM Table WHERE Value = GetMyVariable(); 

但它看起来非常糟糕,用法也很糟糕 – 我必须在每次使用视图前设置@MyVariable。

有没有解决scheme,我可以这样使用:

 SELECT Column FROM MyView(2) WHERE (...) 

具体情况如下:我有一个表存储有关拒绝请求的信息:

 CREATE TABLE Denial ( Id INTEGER UNSIGNED AUTO_INCREMENT, PRIMARY KEY(Id), DateTime DATETIME NOT NULL, FeatureId MEDIUMINT UNSIGNED NOT NULL, FOREIGN KEY (FeatureId) REFERENCES Feature (Id) ON UPDATE CASCADE ON DELETE RESTRICT, UserHostId MEDIUMINT UNSIGNED NOT NULL, FOREIGN KEY (UserHostId) REFERENCES UserHost (Id) ON UPDATE CASCADE ON DELETE RESTRICT, Multiplicity MEDIUMINT UNSIGNED NOT NULL DEFAULT 1, UNIQUE INDEX DenialIndex (FeatureId, DateTime, UserHostId) ) ENGINE = InnoDB; 

多重性是在同一秒中logging的相同请求的数量。 我想显示一个拒绝列表,但有时,当应用程序被拒绝,它会重试几次,以确保。 所以通常情况下,当同一用户在几秒钟内拒绝三次相同的function时,实际上是一次拒绝。 如果我们有更多的资源,为了满足这个要求,接下来的两个拒绝就不会发生。 因此,我们希望将报告中的拒绝分组,以便用户指定应拒绝的时间范围。 例如,如果我们在时间戳1,2,24,26,27,45中拒绝(对于用户1在特征1上),并且用户想要将相互接近的拒绝分组比4秒更近,他应该得到如下的结果: 1(x2),24(x3),45(x1)。 我们可以假设,真正的否定之间的空间比重复之间的空间要大得多。 我用下面的方法解决了这个问题:

 CREATE FUNCTION GetDenialMergingTime() RETURNS INTEGER UNSIGNED DETERMINISTIC NO SQL BEGIN IF ISNULL(@DenialMergingTime) THEN RETURN 0; ELSE RETURN @DenialMergingTime; END IF; END| CREATE VIEW MergedDenialsViewHelper AS SELECT MIN(Second.DateTime) AS GroupTime, First.FeatureId, First.UserHostId, SUM(Second.Multiplicity) AS MultiplicitySum FROM Denial AS First JOIN Denial AS Second ON First.FeatureId = Second.FeatureId AND First.UserHostId = Second.UserHostId AND First.DateTime >= Second.DateTime AND First.DateTime - Second.DateTime < GetDenialMergingTime() GROUP BY First.DateTime, First.FeatureId, First.UserHostId, First.Licenses; CREATE VIEW MergedDenials AS SELECT GroupTime, FeatureId, UserHostId, MAX(MultiplicitySum) AS MultiplicitySum FROM MergedDenialsViewHelper GROUP BY GroupTime, FeatureId, UserHostId; 

然后,要显示来自用户1和2的拒绝function3和4,每5秒合并一次,您需要做的是:

 SET @DenialMergingTime := 5; SELECT GroupTime, FeatureId, UserHostId, MultiplicitySum FROM MergedDenials WHERE UserHostId IN (1, 2) AND FeatureId IN (3, 4); 

我使用视图,因为在其中很容易过滤数据,并在jQuery网格中显式使用它,自动sorting,限制logging数量等等。

但这只是一个丑陋的解决方法。 有没有适当的方法来做到这一点?

其实如果你创buildfunc:

 create function p1() returns INTEGER DETERMINISTIC NO SQL return @p1; 

并查看:

 create view h_parm as select * from sw_hardware_big where unit_id = p1() ; 

然后你可以用一个参数调用一个视图:

 select s.* from (select @p1:=12 p) parm , h_parm s; 

我希望它有帮助。

 CREATE VIEW MyView AS SELECT Column, Value FROM Table; SELECT Column FROM MyView WHERE Value = 1; 

在MySQL中是正确的解决scheme,其他一些SQL让你更确切地定义视图。

注意:除非View非常复杂,否则MySQL会优化它。

我以前想出了一个不使用存储过程的解决方法,而是使用参数表和一些connection_id()方法。

编辑(从评论复制)

创build一个包含名为connection_id的列的表(使其成为bigint)。 在该表中放置列以查看视图的参数。 把主键放在connection_id 。 replace到参数表中并使用CONNECTION_ID()来填充connection_id值。 在视图中使用交叉连接到参数表,并把WHERE param_table.connection_id = CONNECTION_ID() 。 这将交叉连接从参数表中只有一行,这是你想要的。 然后,您可以使用where子句中的其他列,例如orders.order_id = param_table.order_id