从PHP调用参数化MySQL视图

从PHP调用参数化MySQL视图,php,mysql,view,Php,Mysql,View,我正试图在mysql中构建一个参数化视图,这样我就可以从PHP中指定参数来调用它 实际上有两个视图:第一个实现参数,第二个仅从第一个视图中选择: CREATE VIEW first_view AS SELECT * FROM my_table t WHERE t.parameter < get_parameter(); CREATE VIEW second_view AS SELECT * FROM first_view; 然后,我的查询如下所示: SELECT v.* FROM (s

我正试图在mysql中构建一个参数化视图,这样我就可以从PHP中指定参数来调用它

实际上有两个视图:第一个实现参数,第二个仅从第一个视图中选择:

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

CREATE VIEW second_view AS
SELECT * FROM first_view;
然后,我的查询如下所示:

SELECT v.* FROM (select @parameter := '2014-12-31' p) par, first_view v 
这种查询允许我指定参数,然后从
first\u view
中选择所有内容

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

我在workbench和PHP上使用的是同一个mysql用户,所以这不应该是一个任务前问题

如何使用PHP获得结果集

更新

我一直在Mysql CLI客户机上尝试这一点,它会像PHP一样返回一个空集

它看起来像查询:

SELECT v.* FROM (select @parameter := '2014-12-31' p) par, first_view v 
实际上没有设置
@参数
变量,或者至少不是第一次

事实上,如果我运行两次查询,它就会工作,并且视图会返回预期的结果。 我通过将两条语句从php发送到mysql解决了这个问题:

首先,我设置参数:

SET @parameter = '2014-12-31';
我运行实际查询时遇到的问题:

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

来自mysql参考:

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

函数没有输入参数,但考虑在函数外部声明的变量

从mysql参考:

将非确定性例程声明为确定性例程可能会导致 导致优化器做出不正确选择的意外结果 执行计划选择

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

您可以尝试在CLI查询过程中禁用缓存来验证这一点:

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

我的第一个猜测是,将get_parameters()函数声明为确定性函数可能是个问题。您是否在没有声明为确定性的情况下进行了尝试?我尝试声明函数为非确定性,现在查询可以在没有预先设置变量的情况下工作。但为什么会有不同呢?
SELECT SQL_NO_CACHE v.* FROM (select @parameter := '2014-12-31' p) par, first_view v