繁体   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