【问题标题】:Is it possible to use a variable or parameter in a MySQL view?是否可以在 MySQL 视图中使用变量或参数?
【发布时间】:2016-02-10 11:12:39
【问题描述】:

我正在尝试创建如下视图:

CREATE VIEW v_MyView
AS

SET @par_count := 0;  -- XXX Working in SELECT, but not in a View !? XXX

SELECT
    q1.day,
    q1.count_per_day,
    (@par_count := @par_count  + q1.count_per_day) AS count_sum  -- sums up count_per_day 
FROM
    (SELECT
        DATE(registration_date_time_obj) AS day,
        COUNT(Date(registration_date_time_obj)) AS count_per_day
     FROM  tbl_registration_data
     GROUP BY day
     ORDER BY day
    ) AS q1
;

select 语句本身工作正常,只是在 MySQL 中创建视图失败,因为我猜它的声明中不接受用户变量/参数。

有没有办法仍然使用参数的解决方法来创建此视图?

无论如何,我可以为 select 语句创建一个类似的过程,但这并不能真正解决问题,因为我无法在另一个 select 语句中调用该过程...

感谢您的建议和解决方案! (:

【问题讨论】:

  • 仅为此我们提供了函数。尝试创建函数,以便您可以在 select 语句中使用它。

标签: mysql sql variables view parameters


【解决方案1】:

MySQL documentation 很清楚不允许使用变量:

  • SELECT 语句不能引用系统变量或用户定义的变量。

  • 在存储的程序中,SELECT 语句不能引用程序参数或局部变量。

您可以使用相关子查询做您想做的事:

 SELECT DATE(registration_date_time_obj) AS day,
        COUNT(Date(registration_date_time_obj)) AS count_per_day,
        (SELECT COUNT(*)
         FROM tbl_registration_data rd2
         WHERE rd2.registration_date_time_obj <= date_add(date(rd.registration_date_time_obj), interval 1 day)
 FROM  tbl_registration_data rd
 GROUP BY day
 ORDER BY day;

【讨论】:

  • 几乎! ;) 只是 WHERE rd2.reg... 行不工作。但是,如果我只使用 WHERE rd2.registration_date_time_obj &lt;= rd.registration_date_time_obj 就可以了。
  • 现在,如果我在两个 SELECT 语句中需要另一个 WHERE ... 限制,那将如何解决,因为将 WHERE 放在 VIEW 选择上只会限制外部选择...:?跨度>
  • @webMac 。 . .您可能需要将where 条件放在子查询和外部查询中。
  • 我做了,只是对于特定的选择它工作正常,但是将原点选择放在一个视图中并在选择视图语句上应用 where 子句,它只适用于视图中的外部选择语句!在我的具体示例中,我尝试在您的建议的内部和外部选择中每年进行过滤。知道如何解决这个问题,还是我必须每年创建一个视图/在哪里选择? (不是一个好方法)
【解决方案2】:

请阅读关于 VIEWS 的文档 >> https://dev.mysql.com/doc/refman/5.5/en/create-view.html

视图定义受以下限制:

  • SELECT 语句的 FROM 子句中不能包含子查询。

  • SELECT 语句不能引用系统变量或用户定义的变量。

  • 在存储的程序中,SELECT 语句不能引用程序 参数或局部变量。

  • SELECT 语句不能引用准备好的语句参数。

  • 定义中引用的任何表或视图都必须存在。之后 视图已创建,可以删除一个表或视图 定义所指。在这种情况下,使用视图会导致 错误。要检查视图定义是否存在此类问题,请使用 CHECK TABLE 语句。

  • 定义不能引用 TEMPORARY 表,您也不能 创建一个 TEMPORARY 视图。

  • 您不能将触发器与视图相关联。

  • 检查 SELECT 语句中列名的别名 最大列长度为 64 个字符(不是最大别名 长度为 256 个字符)。

【讨论】:

    猜你喜欢
    • 2015-04-29
    • 2012-06-21
    • 2020-08-12
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 2011-08-16
    相关资源
    最近更新 更多