簡體   English   中英

根據條件運行兩個不同的SELECT查詢之一

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM