2014-12-04 43 views
0

这是我的问题,简而言之。根据条件运行两个不同SELECT查询之一

我有一张桌子。它包含我想根据相对于服务器时间($ time)的开始时间列和结束时间列的值显示的消息。

表格的第一行是我想要显示的默认消息,如果有NO消息的开始时间为< = $ 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. 

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

+1

因为您正在收到一些PHP错误消息,您是否也可以显示您的PHP代码? – 2014-12-04 18:28:17

回答

0

不要做两个查询。在单个查询中执行:

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

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

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

+0

嗨,迈克。我发现你的解决方案对我所要做的事情最有效。我同意我正在做的是有点反直觉。通常我会将默认状态存储为一个与我的数据库内容无关的变量,并将其拖到IF/Else语句中。我需要使默认状态成为可以通过表单修改的东西,因此它也必须由db驱动。我改变了你的代码,所以它通过DESC排序,并使用LIMIT来显示最高结果。这工作。感谢您指点我正确的方向! – JohnProvidence 2014-12-04 20:08:08

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

啊。好主意!我会试一试。谢谢! – JohnProvidence 2014-12-04 18:32:35

+0

太棒了!请注意,我只是编辑了mysqli_query以便正确显示$连接参数。 – 2014-12-04 18:37:10

相关问题