我有一个查询,当前突出显示当前约会为“NOW”,所有后续约会为“NEXT”。我无法适应这一点,但只显示一个约会作为下一个约会。
这是我到目前为止所拥有的......
SELECT
user_name,
DATE(apt_start_datetime) AS apt_date,
TIME(apt_start_datetime) AS apt_start_time,
TIME(apt_end_datetime) AS apt_end_time,
CASE
WHEN (NOW() BETWEEN apt_start_datetime AND apt_end_datetime) THEN 'NOW'
ELSE
CASE WHEN (NOW() < apt_start_datetime) THEN 'NEXT' ELSE NULL END
END AS now_next
FROM
users
JOIN
apts ON DATE_FORMAT(CURDATE(), "%x%v") = DATE_FORMAT(apt_start_datetime, "%x%v")
WHERE
user_id = 123456
ORDER BY
apt_date,
apt_start_time
返回类似于:
的内容user_name apt_date apt_start_time apt_end_time now_next
--------------------------------------------------------------------------
user1 2015-11-20 10:45:00 10:55:00 null
user2 2015-11-20 10:55:00 11:55:00 NOW
user3 2015-11-20 11:55:00 12:15:00 NEXT
user4 2015-11-20 12:15:00 12:35:00 NEXT
user5 2015-11-20 12:35:00 12:55:00 NEXT
但我想要的是:
user_name apt_date apt_start_time apt_end_time now_next
--------------------------------------------------------------------------
user1 2015-11-20 10:45:00 10:55:00 null
user2 2015-11-20 10:55:00 11:55:00 NOW
user3 2015-11-20 11:55:00 12:15:00 NEXT
user4 2015-11-20 12:15:00 12:35:00 null
user5 2015-11-20 12:35:00 12:55:00 null
有什么想法吗?
答案 0 :(得分:0)
问题导致sql的这一部分
CASE WHEN (NOW() < apt_start_datetime) THEN 'NEXT' ELSE NULL END
apt_start_datetime早于NOW()的所有行都将具有“NEXT”。
你必须找到第一个 apt_start_datetime,然后是NOW(),这个日期时间用于比较而不是apt_start_datetime。
在伪sql中像
CASE WHEN (NOW() < (SELECT apt_start_datetime FROM tbl WHERE apt_start_datetime > NOW() ORDER BY DIFF(apt_start_datetime,NOW()) DESC LIMIT 1)) THEN 'NEXT' ELSE NULL END
编辑:这是最简单的解决方案,但会很慢