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