当前位置: 首页 > 面试题库 >

我可以在MySQL中使用参数创建视图吗?

洪旻
2023-03-14
问题内容

我有这样的看法:

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

我想使其更通用,这意味着将2更改为变量。我尝试了这个:

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

但是MySQL不允许这样做。

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

CREATE FUNCTION GetMyVariable() RETURNS INTEGER DETERMINISTIC NO SQL
BEGIN RETURN @MyVariable; END|

然后视图是:

CREATE VIEW MyView AS
   SELECT Column FROM Table WHERE Value = GetMyVariable();

但是它看起来确实很糟糕,用法也很糟糕-我必须在每次使用视图之前设置@MyVariable。

有没有一种解决方案,我可以这样使用:

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;

多重性是在同一秒内记录的多个相同请求。我想显示一个拒绝列表,但是有时候,当应用程序被拒绝时,它会重试几次以确保。因此,通常,当同一用户在几秒钟内对同一功能拒绝3次时,实际上是一次拒绝。如果我们还有更多资源可以满足此请求,则不会发生接下来的两次拒绝。因此,我们希望将拒绝项分组到报告中,从而允许用户指定拒绝项的分组时间。例如,如果我们在时间戳中有拒绝(针对功能1上的用户1):1,2,24,26,27,45,并且用户希望将彼此之间相距不超过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拒绝功能3和4每5秒合并的拒绝,您要做的就是:

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

我使用视图是因为它很容易过滤数据并在jQuery网格中显式使用它,自动排序,限制记录数等。

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


问题答案:

实际上,如果您创建func:

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;

希望对您有所帮助。



 类似资料:
  • 问题内容: 我需要创建一个视图,该视图具有一个名为row_num的列,将在其中插入行号,就像在普通表中自动递增一样。 假设我有这个普通表: 等等… 我要创建的视图是: 等等… 我可以通过一次选择生成row_num: 但是我的问题是将上面的查询与创建视图的查询结合起来。这是我正在尝试的组合查询: 我收到以下错误:#1351-视图的SELECT包含变量或参数 我知道我不能在带有视图的选择内使用选择,但

  • 问题内容: 我想创建一个使用PDO与MySQL交互的类。我可以使用PDO创建一个新的MySQL表吗? 问题答案: 是的你可以。 该部分是PDO构造函数的第一个参数,不必具有数据库名称。您可以简单地使用。然后,如果您具有适当的特权,则可以使用常规SQL命令创建数据库和用户等。 以下是install.php的示例,它以root用户身份登录,创建一个数据库,一个用户,并向用户授予对新创建的数据库的所有特

  • 主要内容:基本语法,创建基于单表的视图,创建基于多表的视图,查询视图创建视图是指在已经存在的 MySQL 数据库表上建立视图。视图可以建立在一张表中,也可以建立在多张表中。 基本语法 可以使用 CREATE VIEW 语句来创建视图。 语法格式如下: CREATE VIEW <视图名> AS <SELECT语句> 语法说明如下。 :指定视图的名称。该名称在数据库中必须是唯一的,不能与其他表或视图同名。 :指定创建视图的 SELECT 语句,可用于查询多个基础表或源

  • 要创建可视化视图: 点击左侧导航栏的 Visualize 。 点击 Create new visualization 按钮或 + 按钮。 选择视图类型: 基础图形 Line, Area and Bar charts 在X/Y图中比较两个不同的序列。 Heat maps 使用矩阵的渐变单元格. Pie chart 显示每个来源的占比。 数据 Data table 显示一个组合聚合的原始数据。 Met

  • 我想创建一个名为的视图,该视图显示个人的所有信息,除了他们的客户ID之外,还列出每个人在他/她的帐户中有多少余额。 我的疑问是: 现在,这个查询将创建视图,但当我想通过以下命令查看该视图中的信息时: 它将返回一个错误: 如何走出这个误区?

  • 问题内容: 我可以在mysql中使用聚合函数(LAST)吗? 如果是,那么为什么给我以下查询错误: 错误 ::您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以在第1行的’()FROM group by ‘ 附近使用正确的语法 编辑 ::我得到答案“最后一个”不在MySql中使用。那么如何在MySql中执行呢? 问题答案: 不,在mysql中没有所谓的LAST 查看汇总函数列表