查询仅返回发布后60秒内的记录

时间:2014-06-12 13:26:30

标签: php mysql sql

我在这里有一个查询,用于查找用户之间的消息:

SELECT *
FROM msgs
WHERE
    (recipientid = '{$_SESSION['rider_id']}' AND authorid = '{$riderid}') 
    OR
    (authorid = '{$_SESSION['rider_id']}' AND recipientid = '{$riderid}')
ORDER BY datesent DESC

现在我有一个AJAX调用,它会在实际页面上每隔30秒触发一次以动态发布新消息,我希望它能够抓取已发布的任何消息,这些消息在发布后30秒内。我无法让它发挥作用。我试过这个:

SELECT *
FROM msgs
WHERE
     (recipientid = '{$_SESSION['rider_id']}' AND authorid = '{$authorrider['id']}')
     OR
     (authorid = '{$_SESSION['rider_id']}' AND recipientid = '{$authorrider['id']}')
     AND
     (datesent >= DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 30 SECOND))

但它仍会返回所有消息。不是在最后30秒内。

我还需要在拉出后将状态设置为1,因此如果有人在30秒内做出两次回复,则不会被拉和.prepended()两次。

因此,一旦我能够获得所需的记录,我将不得不运行SET查询来设置状态。我的MySQL并没有真正意识到如何实现这一目标。

我想到的另一种方法是在检索时将状态设置为1。然后我的AJAX查询可以只提取status = 0的记录。

4 个答案:

答案 0 :(得分:3)

我认为您的问题是where子句中缺少括号。试试这个:

SELECT *
FROM msgs
WHERE ((recipientid = '{$_SESSION['rider_id']}' AND authorid = '{$authorrider['id']}') OR 
       (authorid = '{$_SESSION['rider_id']}' AND recipientid = '{$authorrider['id']}')
      ) AND 
      (datesent >= DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 30 SECOND));

答案 1 :(得分:1)

您需要在括号中合并ID标准。事实上,如果您的recipientidauthorid条件匹配,则OR(包括日期)之后的任何内容都将永远无法检查。

所以:

SELECT * FROM msgs WHERE 
 ((recipientid = '{$_SESSION['rider_id']}' AND authorid = '{$authorrider['id']}') OR
  (authorid = '{$_SESSION['rider_id']}' AND recipientid = '{$authorrider['id']}')) AND
 (datesent >= DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 30 SECOND))

答案 2 :(得分:0)

SELECT * FROM msgs WHERE (recipientid = '{$_SESSION['rider_id']}' AND authorid = '{$authorrider['id']}') OR (authorid = '{$_SESSION['rider_id']}' AND recipientid = '{$authorrider['id']}') AND (DATE_DIFF(datesent,NOW()) > 30))

试试

答案 3 :(得分:0)

我尝试删除db必须做的任何想法并让客户端完成工作。为此,我会在ajax查询中发送一个减去30秒的时间戳,而不是让DB弄清楚它。

如果这没有意义,我想听听原因。