我正在用PHP构建一个小规模的论坛脚本,我很难演示给定线程的读/未读状态。
所以,我有一个特别庞大的查询,它返回线程信息,包括它首次发布的日期,上次发布的日期(如果有的话)以及当前最后查看的日期登录用户(如果存在这样的日期。
然后查询返回三个值:
我需要检查的是,如果firstPostDate或lastPostDate比lastViewDate更新,那么将该线程标记为新的/具有未读回复。
我在PHP中执行此操作时遇到问题,因为我的日期都存储为MySQL中的时间戳。起初我以为我可以使用UNIX_TIMESTAMP返回一个Unix时间戳,然后比较它们,但我不相信我得到了正确的结果(因为时间戳是YMD HMS格式(或者类似,我不记得了)我的头顶。)
我在网站上有其他查询比较两个日期,这看起来效果很好。有没有办法可以比较mysql查询中的两个或三个日期,如果是新的则返回“YES”,如果不是,则返回“NO”?它会使我的PHP标记更简单。
或者我是以错误的方式解决这个问题?
答案 0 :(得分:2)
您可以将表达式用作结果集中的附加字段:
SELECT ...
(firstPostDate > lastViewDate OR lastPostDate > lastViewDate) AS unread
FROM posts;
当线程为新/具有未读回复时,unread
字段应为1
,否则为0
。
测试用例:
CREATE TABLE posts (
id int,
firstPostDate timestamp,
lastPostDate timestamp,
lastViewDate timestamp
);
INSERT INTO posts VALUES (1, '2010-01-01 12:00', '2010-01-02 12:00', '2010-01-03 12:00');
INSERT INTO posts VALUES (2, '2010-01-03 12:00', '2010-01-05 12:00', '2010-01-04 12:00');
INSERT INTO posts VALUES (3, '2010-01-06 12:00', '2010-01-06 12:00', '0000-00-00 00:00');
INSERT INTO posts VALUES (4, '2010-01-07 12:00', '2010-01-07 12:00', '2010-01-08 12:00');
结果:
SELECT id,
(firstPostDate > lastViewDate OR lastPostDate > lastViewDate) AS unread
FROM posts;
+------+--------+
| id | unread |
+------+--------+
| 1 | 0 |
| 2 | 1 |
| 3 | 1 |
| 4 | 0 |
+------+--------+
4 rows in set (0.01 sec)