2014-12-02 69 views
1

我想在mysql中构建参数视图,以便我可以从PHP中指定参数来调用它。从PHP调用参数化MySQL视图

有两个视图实际上是:

CREATE VIEW first_view AS 
SELECT * FROM my_table t WHERE t.parameter < get_parameter(); 

CREATE VIEW second_view AS 
SELECT * FROM first_view; 

get_parameter功能实现如下::

CREATE FUNCTION get_parameter() RETURNS timestamp 
    NO SQL 
    DETERMINISTIC 
BEGIN 
    IF ISNULL(@parameter) THEN 
     RETURN DATE(CURDATE()- INTERVAL DAYOFYEAR(CURDATE()) DAY); 
    ELSE 
     RETURN @parameter; 
    END IF; 
END 

它实现了参数,第二个,其刚刚从首先选择第一个然后,我的查询,如下所示:

SELECT v.* FROM (select @parameter := '2014-12-31' p) par, first_view v 

这种查询允许我指定参数,然后从first_view中选择所有内容。

当我在Mysql Workbench上运行这样的查询时,一切都按预期工作,而当我通过PHP运行它时,它会返回一个空集。

我在工作台和PHP上使用相同的mysql用户,所以它不应该是一个准许问题。

我怎样才能得到PHP的结果集呢?

UPDATE

我已经Mysql的CLI客户机上尝试这种和PHP做它返回一个空集。

它看起来像查询:

SELECT v.* FROM (select @parameter := '2014-12-31' p) par, first_view v 

实际上并没有设置@parameter变量,或者至少不是第一次了。

Infact,如果我运行查询两次,那么它的工作原理和视图返回所期望的。 我通过发送从PHP两条语句,MySQL的解决了这个问题:

首先,我设置的参数:

SET @parameter = '2014-12-31'; 

在我运行的实际查询:

SELECT * FROM second_view; 

现在我想知道:为什么第一个查询没有正确地实例化参数?

+0

我的第一个猜测是,该声明get_parameters()函数确定性可能是问题。您是否尝试过,但没有将其声明为DETERMINISTIC? – 2014-12-07 13:20:54

+0

我试过声明函数NOT DETERMINISTIC,现在查询没有事先设置变量。但为什么它有所作为? – Dalen 2014-12-07 16:04:23

回答

2

从MySQL参考:

一个程序被认为是“确定性”,如果它总是产生相同的 结果对于相同的输入参数

你的函数没有输入参数,但认为一在函数之外声明的变量。

从MySQL参考:

声明具有不确定性的常规作为确定性可能通过使优化做出不正确 执行计划的选择导致 意想不到的结果。

这只是推测:但是它在MySQL工作台而不是CLI/PHP中的工作原因可能是工作台会话中的查询缓存可能在默认情况下被禁用。

你可以尝试CLI查询过程来验证这个禁用缓存:

SELECT SQL_NO_CACHE v.* FROM (select @parameter := '2014-12-31' p) par, first_view v