2012-04-14 46 views
0

我运行这段代码:运行此代码时会发生什么?

$sql = "SELECT IF(TIMEDIFF(NOW(),last_update) > '02:00:00',1,0) AS morethan FROM products LIMIT 1"; 

    if($stmt = $this->connect->prepare($sql)) { 
     $stmt->execute(); 
     $stmt->bind_result($result); 
     $stmt->fetch(); 
     $stmt->close(); 
    } else { 
     return false; 
    } 

    return $result; 

我得到0,这意味着我在检查它的差异没有被发现?

+0

很多代码是缺少我想...什么是$结果? – skyline26 2012-04-14 17:04:11

+0

是的,我得到0.我试图得出时间之间的差异,或者如果差异超过2个小时,我会得到某种假或真的差异。 – Roland 2012-04-14 17:04:50

+0

@toPeerOrNotToPeer - '$ result'是var我绑定的结果,但我不确定会发生什么。 – Roland 2012-04-14 17:06:00

回答

3

Mysql的IF是这样工作的:

IF(condition, true, false) 

您在结果revceive 0 “人数超过” 这意味着

TIMEDIFF(NOW(),last_update) > '02:00:00' 

是假的,换句话说timeDiff测量比02小: 00:00

+0

这就是我想听到的,所以可以这样做吗?我甚至可以删除那个'AS'? – Roland 2012-04-14 17:07:21

+1

有几种方法可以做到这一点,你的就是其中之一;)是的,AS不是必需的。 – 2012-04-14 17:18:52

2

您可以改写您的查询,只是删除了IF

SELECT (TIMEDIFF(NOW(),last_update) > '02:00:00') morethan FROM products LIMIT 1 

您的查询将实际上非确定性地从表格产品中获取一行(这意味着您无法预测哪一行),并检查它是否与您的条件相符。如果是,则查询将返回1,否则0。我认为那不是你的意图,对吧?

如果你想检查是否存在满足该条件,你可以做到这一点任何行:

select 1 existsInTable from products 
where TIMEDIFF(NOW(),last_update) > '02:00:00' 
limit 1 

时没有找到匹配这将返回1只要找到一个匹配和一个空的结果集。您甚至不需要检查返回的值,因为您只需计算mysql_num_rows查询返回的干系数即可。

+0

+1我不想重写它,它已经像我以前那样工作了,我需要确认它实际上做了我认为它的工作:)并感谢您的提示,我会尝试您的方法看到结果。 – Roland 2012-04-14 17:20:04

+0

@Roland小心点。在答案中,我告诉你,你的查询没有做你想做的事情:)为了使它更清楚:它将需要一个*随机*行并检查它是否满足条件并返回1或0。这几乎就像翻转一枚硬币。 – 2012-04-14 17:24:27

+0

但是,这是事情,我检查它在所有行中是相同的值,所以如果在任何行中遇到超过2小时的差比我需要更新所有信息。 – Roland 2012-04-14 17:30:40

相关问题