2014-12-04 127 views
0

這是我的問題,簡而言之。根據條件運行兩個不同SELECT查詢之一

我有一張桌子。它包含我想根據相對於服務器時間($ time)的開始時間列和結束時間列的值顯示的消息。

表格的第一行是我想要顯示的默認消息,如果有NO消息的開始時間爲< = $ time且結束時間> $ time。

我可以拉最新的消息,並使用此查詢顯示沒有問題:

SELECT * FROM $table WHERE start <= $time and end > $time; 

我想不出如何讓我的默認顯示如果沒有其他行符合上述標準。

我嘗試這樣做:

$sql="SELECT CASE WHEN (SELECT COUNT(*) FROM $table WHERE start <= $time AND end > $time) > 0 
    THEN (SELECT * FROM $table WHERE start <= $time AND end > $time) 
    ELSE (SELECT * FROM $table WHERE id = 1) 
    END"; 

但它返回此錯誤:

Fatal error: Call to a member function fetch_assoc() on a non-object. 

不知道該怎麼做。任何想法或幫助將不勝感激!

+1

因爲您正在收到一些PHP錯誤消息,您是否也可以顯示您的PHP代碼? – 2014-12-04 18:28:17

回答

0

不要做兩個查詢。在單個查詢中執行:

SELECT * 
FROM $table 
WHERE (start <= $time and end > $time) 
OR id = 1 
ORDER BY id ASC 

這將始終返回id = 1的行,並且還會返回任何與之匹配的其他行。假設1是您的最低id值,這將始終返回第一行中的默認值。

我會說,雖然這通常是一種編程反模式。我會認爲你的默認值應該在代碼配置的某個地方定義,而不是混入你的合法數據行中。你將不得不做奇怪的事情,比如這個查詢來解決你希望以這種方式存儲默認值的願望。

+0

嗨,邁克。我發現你的解決方案對我所要做的事情最有效。我同意我正在做的是有點反直覺。通常我會將默認狀態存儲爲一個與我的數據庫內容無關的變量,並將其拖到IF/Else語句中。我需要使默認狀態成爲可以通過表單修改的東西,因此它也必須由db驅動。我改變了你的代碼,所以它通過DESC排序,並使用LIMIT來顯示最高結果。這工作。感謝您指點我正確的方向! – JohnProvidence 2014-12-04 20:08:08

0

用PHP代替SQL來實現它。我不知道你的系統,但對於mysqli:

$sql = "SELECT * FROM $table WHERE start <= $time and end > $time;"; 

$res = mysqli_query($dbobj,$sql); 

if (!$res || !$res->num_rows) { 
    $sql = "SELECT * FROM $table WHERE id = 1;"; 
} 
$res = mysqli_query($dbobj,$sql); 
+1

啊。好主意!我會試一試。謝謝! – JohnProvidence 2014-12-04 18:32:35

+0

太棒了!請注意,我只是編輯了mysqli_query以便正確顯示$連接參數。 – 2014-12-04 18:37:10

相關問題