根据条件运行两个不同的SELECT查询之一

时间:2014-12-04 18:20:30

标签: php mysql sql

简而言之,这是我的问题。

我有一张桌子。它包含我想根据相对于服务器时间($ 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.

不确定该怎么做。任何想法或帮助将不胜感激!

2 个答案:

答案 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值,这将始终返回第一行中的默认值。

我会说,这通常是一种编程反模式。我认为你的默认值应该在某个地方的代码配置上定义,而不是与你的合法数据行混合。你将不得不做一些奇怪的事情,比如这个查询来解决你希望以这种方式存储默认值的想法。