2014-12-02 49 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