1

这是一个 Mysql/sql 查询问题,但请允许我解释一下上下文:我想为我的 PHP 日历配备一个“< PREV”和“NEXT >”按钮,允许用户轻松转到上一个或下一个可用月份有可用的数据库条目。如果没有可用的数据库条目,我想禁用该按钮(我不希望系统显示一个空日历)。

示例: 用户有 FEB 视图。JAN 和 MAR 不包含条目,但 DEC 和 APR 包含。然后“下一步 >”按钮需要切换到四月日历。'< PREV' 按钮需要切换到十二月日历。

所以基本上我正在寻找一个有效的查询,可以检查条目是否存在于视图中的月份之前和之后(但不是部分)。

该表有一个字段“logDate”,其日期类型为“Ymd”。

我开始摸索以下查询,首先检查给定日期之前和之后是否存在日期,但我知道这个查询有一些问题。一方面,如果表中有一个条目是“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
4

3 回答 3

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 中执行此操作,因为它可能会产生更具可读性的代码。)

根据结果​​是空值还是日期,以不同方式显示链接。

如果您要提取日期而不是 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

但这取决于您对找到的信息所做的工作。如果您所做的只是创建指向新月份的链接,那么将最近的日期拉到不在同一个月内应该可以解决问题。

于 2013-03-21T17:23:48.770 回答
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
于 2013-03-21T18:09:57.510 回答
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
于 2013-03-21T17:32:08.930 回答