Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.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 当日期相同时从MySQL获取下一个和上一个_Php_Mysql - Fatal编程技术网

Php 当日期相同时从MySQL获取下一个和上一个

Php 当日期相同时从MySQL获取下一个和上一个,php,mysql,Php,Mysql,现在我遇到了一个问题,因为从外部源向数据库导入行的速度太快了 如果创建的多行具有完全相同的发布日期,则无法按日期排序并按顺序滚动帖子 假设五行都是在上午11:22:04生成的: 第1排-上午11:22:04 第2排-上午11:22:04 第3排-上午11:22:04 第4排-上午11:22:04 第5排-上午11:22:04 如果一个访问者正在查看第3行,并且想要查看下一行,我将要求数据库提供发布时间晚于或等于上午11:22:04的下一行,无论我做什么,这将是第1行 如果我不说或等于,那就意味着

现在我遇到了一个问题,因为从外部源向数据库导入行的速度太快了

如果创建的多行具有完全相同的发布日期,则无法按日期排序并按顺序滚动帖子

假设五行都是在上午11:22:04生成的:

第1排-上午11:22:04 第2排-上午11:22:04 第3排-上午11:22:04 第4排-上午11:22:04 第5排-上午11:22:04 如果一个访问者正在查看第3行,并且想要查看下一行,我将要求数据库提供发布时间晚于或等于上午11:22:04的下一行,无论我做什么,这将是第1行

如果我不说或等于,那就意味着访问者永远不会看到第4行或第5行,这和总是看到第1行一样糟糕。 将行ID添加到ORDERBY子句没有任何帮助,因为如果我当前正在查看第3行,它总是会给我第1行。 在where子句中添加一个大于或小于都没有帮助,因为-例如-如果我正在查看第3行,并且我想要下一行,但是说ID需要大于3,那么我将永远不会得到第1行。 我可以在同一时间更新数据库中发布的每一行,将该行的ID作为秒数,从而欺骗系统,这会将上述记录转换为:

第1排-上午11:22:01 第2排-上午11:22:02 第3排-上午11:22:03 第4排-上午11:22:04 第5排-上午11:22:05 这实际上效果很好。问题是每次管理员导入数据时都会添加新行,我无法不断更新数据库来纠正这一问题

获取下一个和上一个的查询如下所示:

// next row
select  t.*
from    table t
where   t.postdate  >= '{$current_date}'
and     t.postdate  < now()
and     t.id        <> {$current_id}
order   by t.postdate
limit   1

// previous row
select  t.*
from    table t
where   t.postdate  <= '{$current_date}'
and     t.postdate  < now()
and     t.id        <> {$current_id}
order   by t.postdate desc
limit   1
// next row
select  t.*
from    table t
where   CONCAT(t.postdate, t.id)  >= '{$current_date}{$current_id}'
and     t.postdate  < now()
and     t.id        <> {$current_id}
order   by t.postdate
limit   1

// previous row
select  t.*
from    table t
where   CONCAT(t.postdate, t.id)  <= '{$current_date}{$current_id}'
and     t.postdate  < now()
and     t.id        <> {$current_id}
order   by t.postdate desc
limit   1

是的,我已经在谷歌上搜索了这篇文章,并复习了几个关于Stackoverflow的类似问题

你能试试这样的东西吗:

// next row
select  t.*
from    table t
where   t.postdate  >= '{$current_date}'
and     t.postdate  < now()
and     t.id        <> {$current_id}
order   by t.postdate
limit   1

// previous row
select  t.*
from    table t
where   t.postdate  <= '{$current_date}'
and     t.postdate  < now()
and     t.id        <> {$current_id}
order   by t.postdate desc
limit   1
// next row
select  t.*
from    table t
where   CONCAT(t.postdate, t.id)  >= '{$current_date}{$current_id}'
and     t.postdate  < now()
and     t.id        <> {$current_id}
order   by t.postdate
limit   1

// previous row
select  t.*
from    table t
where   CONCAT(t.postdate, t.id)  <= '{$current_date}{$current_id}'
and     t.postdate  < now()
and     t.id        <> {$current_id}
order   by t.postdate desc
limit   1
假设

主要假设ID字段是自动递增的

利用它

就这么简单


也许可以通过asc或desc稍微使用精确的语法来获得所需的结果顺序,>或者您是否查看了使用sql跳过行的命令?我认为偏移量是常用的命令,尽管从未使用过它。不过,这些可能也相关:。也许可以添加二阶字段,可以使用它。你有一个auto_inc int吗?如果没有,你能添加一个吗?如果我错过了,很抱歉above@DanielBrose我看不出跳过行和/或使用偏移量有助于以任何方式解决问题。我尝试了多个不同的ORDER BY子句,但始终遇到相同的问题。@Drew Yes,每行都有一个自动递增字段。使用它没有帮助,因为它只是意味着无论我当前是在第3行还是第4行,我都会将第1行作为下一行。@DavidVincentGagne-我假设您的ID是自动递增的。因此,如果您的ORDER BY有两个字段,postdate和id,那么having和t.id>{$current_id}应该对其进行排序。偏移量可能没有那么有用,因为它假设知道所有行和ect,但是如果postdate是sameNo,那么您总是可以假设ID会更大,对不起。这样做会遇到我在原始问题中解释的相同问题。假设你在第三排着陆。如果你说你希望下一篇文章的日期相同,但ID大于“是”,你将得到第4行。但是如果你想在上一篇文章中日期相同但ID较低,那么你只能得到第1行,而不能得到第2行,因为你必须先按日期排序,再按ID排序,因为并非所有的日期都相同。@DavidVincentGagne-我仔细阅读了你的评论,对不起,我确实需要编辑打字错误,但是范围应该允许进行适当的非此即彼或类型检查。您的ID可以大或小,或者后发日期不同。第1行保持可选择状态。对不起,在解释完之前,我在前面的评论中点击了[return]。它现在更新了,希望能解释为什么使用自动增量字段没有帮助。@DavidVincentGagne-谢谢你,我有发布然后编辑自己的坏习惯;我无法测试语法,但请参阅我的编辑,将ACS或DESC添加到t.id排序将解决此问题。我感谢你的努力,但你还是会得到同样的结果。您的下一个示例每次只返回第1行。我正在尝试这个方法,它在几个测试用例中都有效。我对连接DATETIME和INT11很谨慎,但它似乎没问题。除非我遇到问题,否则我将在接下来的几周内进行大量测试我认为这是最好的答案。谢谢