Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.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
Mysql 从最接近某个日期的表中检索前10个结果,并保持升序排序顺序_Mysql_Database_Sorting - Fatal编程技术网

Mysql 从最接近某个日期的表中检索前10个结果,并保持升序排序顺序

Mysql 从最接近某个日期的表中检索前10个结果,并保持升序排序顺序,mysql,database,sorting,Mysql,Database,Sorting,我有一个包含日历项的表格;在我的web应用程序中,我有两个视图: 视图1:显示接下来10项的主视图,从现在开始 视图2:根据视图1中第一个/最后一个项目的时间戳显示上一个/下一个10个项目的视图。这就是麻烦制造者。 在页面底部,显示了指向视图2的上一个/下一个链接 问题是: 如何在不知道日期的情况下检索前一组10项 起初,这对我来说似乎很简单,但显然不是 数据库表: 用于显示从现在开始的下10项的SQL查询此处没有问题: 基于主视图中第一项的时间戳显示前10项的SQL查询: 我很可能忽略了什么,

我有一个包含日历项的表格;在我的web应用程序中,我有两个视图:

视图1:显示接下来10项的主视图,从现在开始 视图2:根据视图1中第一个/最后一个项目的时间戳显示上一个/下一个10个项目的视图。这就是麻烦制造者。 在页面底部,显示了指向视图2的上一个/下一个链接

问题是:

如何在不知道日期的情况下检索前一组10项

起初,这对我来说似乎很简单,但显然不是

数据库表:

用于显示从现在开始的下10项的SQL查询此处没有问题:

基于主视图中第一项的时间戳显示前10项的SQL查询:


我很可能忽略了什么,所以我需要你的帮助。提前感谢。

这是一个简单的问题,限制子查询

SELECT ci.*
FROM `calendar_item` AS `ci` 
WHERE (ci.id IN (
    SELECT id FROM calendar_item 
    WHERE (end_time < FROM_UNIXTIME(1334667600))
    ORDER BY end_time DESC
    LIMIT 10
))
GROUP BY `ci`.`id` 
ORDER BY `ci`.`end_time` ASC
LIMIT 10
如果没有子查询中的限制,您将选择时间戳 如果您限制子查询,则会得到满足FROM_UNIXTIME要求的最高10个查询,然后外部查询可以选择它们

另一种选择,也是我的首选方法是,子查询获取数据,而外部查询只是在将数据吐出之前对其重新排序

SELECT i.*
FROM (
    SELECT ci.*
    FROM calendar_item AS ci
    WHERE ci.end_time < FROM_UNIXTIME(1334667600)
    ORDER BY ci.end_time DESC
    LIMIT 10
) AS i
ORDER BY i.`end_time` ASC

遗憾的是,我的MySQL版本不支持限制in/ALL/ANY/SOME子查询。不过,还是要感谢第二个例子!我会尝试那种方法。
SELECT ci.*
FROM `calendar_item` AS `ci` 
WHERE (ci.id IN (
    SELECT id FROM calendar_item 
    WHERE (end_time < FROM_UNIXTIME(1334667600))
    ORDER BY end_time DESC
))
GROUP BY `ci`.`id` 
ORDER BY `ci`.`end_time` ASC
LIMIT 10
SELECT ci.*
FROM `calendar_item` AS `ci` 
WHERE ci.end_time <= 1334667600
GROUP BY `ci`.`id` 
ORDER BY `ci`.`end_time` ASC
LIMIT 10
SELECT ci.*
FROM `calendar_item` AS `ci` 
WHERE (ci.id IN (
    SELECT id FROM calendar_item 
    WHERE (end_time < FROM_UNIXTIME(1334667600))
    ORDER BY end_time DESC
    LIMIT 10
))
GROUP BY `ci`.`id` 
ORDER BY `ci`.`end_time` ASC
LIMIT 10
SELECT i.*
FROM (
    SELECT ci.*
    FROM calendar_item AS ci
    WHERE ci.end_time < FROM_UNIXTIME(1334667600)
    ORDER BY ci.end_time DESC
    LIMIT 10
) AS i
ORDER BY i.`end_time` ASC