根据条件运行两个不同的 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.

不知道该怎么办。 任何想法或帮助将不胜感激!

不要进行两个查询。在单个查询中执行此操作:

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

这将始终返回 id = 1 的行,并且还将返回匹配的任何其他行。假设 1 是最低 id 值,这将始终在第一行返回默认值。

我会说,这通常有点编程反模式。 我认为您的默认值应该在某处的代码配置中定义,而不是与您的合法数据行混合在一起。 您将不得不做一些奇怪的事情,例如此查询,以解决您希望以这种方式存储默认值的愿望。

用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);