Php 从数据库获取下一个可用日期
我有一个系统,允许用户将特定文件分配到过去或现在的日期。限制是,他们每天只能为每个用户上载一个文件。当用户上传文件时,日期字段必须默认为当前日期,当该日期不可用时,它将按描述顺序显示过去的第一个可用日期。下面是相关的字段名Php 从数据库获取下一个可用日期,php,mysql,Php,Mysql,我有一个系统,允许用户将特定文件分配到过去或现在的日期。限制是,他们每天只能为每个用户上载一个文件。当用户上传文件时,日期字段必须默认为当前日期,当该日期不可用时,它将按描述顺序显示过去的第一个可用日期。下面是相关的字段名 file_id (INT - INDEX - AUTO INCREMENT) user_id (INT - may index this) upload_date (INT - stores date as a unix timestamp) 我真正找到的唯一解决方案是按日
file_id (INT - INDEX - AUTO INCREMENT)
user_id (INT - may index this)
upload_date (INT - stores date as a unix timestamp)
我真正找到的唯一解决方案是按日期按DESC顺序将它们全部构建到一个数组中,然后循环,直到找到一个空插槽。然而,我觉得如果用户在过去的千天内都被填满了,这真的会导致速度问题。我觉得我忽略了一个简单的解决方案
请注意:出于这样或那样的原因,它们的日期被存储为Unix时间戳,我了解其缺点,我不关心此时是否更正。要获取未使用的最新日期,请执行以下操作:
select user_id, max(date) - 1
from (select ud.*,
(select max(date) from upload_date ud2 where ud2.user_id = ud.user_id and ud2.date < ud.date
) as prevdate
from upload_date ud
) ud
where date(from_unixtime(ud.prevdate)) <> date(from_unixtime(ud.date)) - 1 or
ud.prevdate is null
group by user_id
此查询首先使用相关子查询获取任何给定日期的前一个日期。然后,它将时间值转换为日期,并选择上一个日期有间隔的任何行。日期减去1的最大值就是您要查找的日期
此SQL未经测试,因此可能存在语法错误。解决此问题的一种方法是使用经典的返回缺少行查询。基本上,要从数据库返回缺少的行,需要一种生成缺少的行的方法 要构建这样的查询,我们可以从以下内容开始:
SELECT MAX(t.upload_date)
FROM mytable t
WHERE t.upload_date <= NOW()
AND t.user = 'someuser'
变成这样:
ON u.upload_date >= UNIX_TIMESTAMP(FROM_UNIXTIME(s.upload_date)-INTERVAL n.d+1 DAY)
AND u.upload_date < UNIX_TIMESTAMP(FROM_UNIXTIME(s.upload_date)-INTERVAL n.d DAY)
这是一个很好的方法。当用户在表中只有一行时会发生什么。他今天已经上传了一个文件,但以前从未上传过文件?此查询是否返回昨天的日期?@spencer7593。通过我的快速编辑,我将在where子句的NULL检查中添加日期。谢谢!这也是一个非常快速的查询。
SELECT s.upload_date - INTERVAL n.d DAY AS available_date
FROM ( SELECT MAX(t.upload_date) AS upload_date
FROM mytable t
WHERE t.upload_date <= NOW()
AND t.user = 'someuser'
) s
CROSS
JOIN ( SELECT 0 AS d UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
) n
LEFT
JOIN mytable u
ON u.upload_date = s.upload_date - INTERVAL n.d DAY
AND u.user = 'someuser'
WHERE u.upload_date IS NULL
ORDER BY n.d DESC
LIMIT 1
ON u.upload_date = s.upload_date - INTERVAL n.d DAY
ON u.upload_date >= UNIX_TIMESTAMP(FROM_UNIXTIME(s.upload_date)-INTERVAL n.d+1 DAY)
AND u.upload_date < UNIX_TIMESTAMP(FROM_UNIXTIME(s.upload_date)-INTERVAL n.d DAY)
SELECT DATE(FROM_UNIXTIME(s.upload_date)) - INTERVAL n.d DAY AS available_date