这是一个Mysql / sql查询问题,但允许我解释一下上下文: 我想用我的PHP日历装备'< PREV'和'NEXT>'按钮允许用户轻松前往具有数据库条目可用的上一个或下一个可用月份 。如果没有可用的数据库条目,我想禁用该按钮(我从不希望系统显示空日历)。
示例: 用户有FEB在视野中。 JAN和MAR不包含条目,但DEC和APR不包含条目。 '下一步>'按钮然后需要切换到4月日历。 '< PREV'按钮需要切换到12月日历。
所以基本上我正在寻找一个有效的查询,可以检查条目是否存在于该月份之前和之后(但不是部分)。
该表有一个字段'logDate',其类型为date'Y-m-d'。
我开始摸索以下查询,首先检查在给定日期之前和之后是否存在日期,但我知道此查询存在一些问题。例如,如果表格中有“2013-03-19”的条目,我的查询将为prev吐出1 - 这当然不表示3月之前是否存在条目。
SELECT IF( EXISTS(SELECT dayId FROM LogbookDay
WHERE logDate < '2013-03-20' AND userId = 2), 1, 0) as prev,
IF( EXISTS(SELECT dayId FROM LogBookDay WHERE logDate > '2013-03-20'
AND userId = 2), 1, 0) as next
答案 0 :(得分:4)
将开始日期修改为月份的开头和结尾: 对于prev,您可以修改为该月的第一天,减去比该月当前日期少的1。接下来,你做同样的事情,然后加1个月:
SELECT
(SELECT dayId FROM LogbookDay WHERE
logDate < ADDDDATE('2013-03-20', 1-DAY('2013-03-20')) AND userId = 2
ORDER BY logDate DESC LIMIT 1
) as PREV,
(SELECT dayId FROM LogBookDay WHERE
logDate >= ADDDATE(ADDDDATE('2013-03-20', 1-DAY('2013-03-20')), INTERVAL 1 MONTH) AND userId = 2
ORDER BY logDate ASC LIMIT 1
) as NEXT
(或者,在PHP中执行此操作,因为它可能会产生更易读的代码。)
根据结果是null还是日期,以不同方式显示链接。
如果您提取日期而不是ID,可能会更优雅:
SELECT
(SELECT MAX(logDate) FROM LogbookDay WHERE
logDate < ADDDDATE('2013-03-20', 1-DAY('2013-03-20')) AND userId = 2
) as PREV,
(SELECT MIN(logDate) FROM LogBookDay WHERE
logDate >= ADDDATE(ADDDDATE('2013-03-20', 1-DAY('2013-03-20')), INTERVAL 1 MONTH) AND userId = 2
) as NEXT
但这取决于您所查找信息的具体内容。如果您所做的只是创建一个新月的链接,那么拉出最近的日期并不是在同一个月就可以了。
答案 1 :(得分:1)
使用我自己的查询和来自其中一个已发布的答案的指针,我能够提出一个简单的查询,检查条目是否存在于当前视图中的前几个月和之后的几个月。
假设月份是2013年3月:
SELECT IF( EXISTS(SELECT dayId FROM LogBookDay
WHERE logDate < '2012-03-01' AND userId = 1), 1, 0) as prev,
IF( EXISTS(SELECT dayId FROM LogBookDay
WHERE logDate > CONCAT('2012-03-',LAST_DAY('2003-02-05'))
AND userId = 1), 1, 0) as next
答案 2 :(得分:0)
SELECT
if(min(logDate) < '2013-03-20', 1, 0) 'NEXT',
if(max(logDate) > '2013-03-20', 1, 0) 'PAST'
FROM LogbookDay
WHERE logDate < '2013-03-20' AND logDate > '2013-03-02'
AND userId = 2