我在这里有一个查询,用于查找用户之间的消息:
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的记录。
答案 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标准。事实上,如果您的recipientid
和authorid
条件匹配,则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弄清楚它。
如果这没有意义,我想听听原因。