Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从数据库获取下一个可用日期_Php_Mysql - Fatal编程技术网

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