简而言之,这是我的问题。
我有一张桌子。它包含我想根据相对于服务器时间($ 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.
不确定该怎么做。任何想法或帮助将不胜感激!
答案 0 :(得分:0)
用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);
答案 1 :(得分:0)
不要进行两次查询。在一个查询中执行:
SELECT *
FROM $table
WHERE (start <= $time and end > $time)
OR id = 1
ORDER BY id ASC
这将始终返回id = 1的行,并且还将返回匹配的任何其他行。假设1是您的最低id值,这将始终返回第一行中的默认值。
我会说,这通常是一种编程反模式。我认为你的默认值应该在某个地方的代码配置上定义,而不是与你的合法数据行混合。你将不得不做一些奇怪的事情,比如这个查询来解决你希望以这种方式存储默认值的想法。