[英]Run one of two different SELECT queries based on condition
簡而言之,這是我的問題。
我有一張桌子。 它包含我想根據相對於服務器時間($ time)的開始時間列和結束時間列的值顯示的消息。
如果沒有開始時間<= $ 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.
不知道該怎么辦。 任何想法或幫助將不勝感激!
用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);
不要問兩個。 在單個查詢中執行此操作:
SELECT *
FROM $table
WHERE (start <= $time and end > $time)
OR id = 1
ORDER BY id ASC
這將始終返回id = 1的行,並且還將返回匹配的任何其他行。 假設1是您的最低ID值,那么它將始終在第一行中返回默認值。
我會說,盡管這通常有點像編程反模式。 我認為您的默認值應該在代碼配置中的某個位置定義,而不是與合法數據行混在一起。 您將不得不執行諸如以下查詢之類的怪異操作,以解決以這種方式存儲默認值的願望。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.