Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.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 如何在MySQL表中的一个特定元素周围(之前和之后)选择固定数量的元素?_Php_Mysql_Select - Fatal编程技术网

Php 如何在MySQL表中的一个特定元素周围(之前和之后)选择固定数量的元素?

Php 如何在MySQL表中的一个特定元素周围(之前和之后)选择固定数量的元素?,php,mysql,select,Php,Mysql,Select,我需要一个通过php发出的查询来选择n条记录,比如说在给定记录的前后插入4条记录。如果在当前元素之前插入的行数小于n/2,则剩余的记录n-result1应为在当前记录之后插入的记录。最新的唱片也是如此。选择更多/所有以前的记录 假设当前记录id为1,那么查询将得到记录2、3、4、5 如果当前记录为2,则结果为1,3,4,5 如果当前记录为3,则结果将为1,2,4,5 如果当前记录为6,则结果为4,5,7,8 假设表中有9个元素 如果当前记录为8,则结果为5,6,7,9 如果当前记录是最后9条,结

我需要一个通过php发出的查询来选择n条记录,比如说在给定记录的前后插入4条记录。如果在当前元素之前插入的行数小于n/2,则剩余的记录n-result1应为在当前记录之后插入的记录。最新的唱片也是如此。选择更多/所有以前的记录

假设当前记录id为1,那么查询将得到记录2、3、4、5 如果当前记录为2,则结果为1,3,4,5 如果当前记录为3,则结果将为1,2,4,5 如果当前记录为6,则结果为4,5,7,8

假设表中有9个元素

如果当前记录为8,则结果为5,6,7,9 如果当前记录是最后9条,结果将是5,6,7,8

n实际上是一个固定值,通过php确定。 如果php在上下文中有帮助的话,比如说如果可以使用mysql\u last\u insert,那么使用php是非常受欢迎的

多谢各位

'SELECT ID
FROM Table
WHERE 
ID > '. ($n - 3) .
' AND ID != '. $n .
' ORDER BY ID ASC LIMIT 4'
这样做的优点是只需要一个查询


如果要解决删除行的问题,实际上需要执行两次查询

选择在某个特定ID之前和之后带有和ID的记录,这并不复杂。关键是按记录ID排序,然后只选择小于或大于特定ID的记录:

SELECT * FROM table WHERE id < x ORDER BY id DESC LIMIT 4;
SELECT * FROM table WHERE id > x ORDER BY id ASC LIMIT 4;

这将为您提供两个记录集,其中记录分别位于x之前和x之后。然后,您可以根据记录集的实际大小合并记录,以始终获得最多4条记录。

您的记录是如何识别的,尤其是如何排序的?e、 g.数字标识?你能添加你的表格结构吗?我有一个自动递增的ID字段为每一行。我的问题适用于任何有这样字段的表。还没有。我正在考虑在同一行代码中使mysql\u num\u行复杂化的事情,但还没有尝试过,仍然在寻找选项:这不会根据当前ID的位置给出不同的结果计数吗?如果ID是我表中的第一个,它将给出3个结果,而如果ID位于表的中间,则在++2之后给出6个结果3。我需要一个恒定数量的结果,比如说4:2之前和2之后。如果当前ID位于表的开头,并且在当前ID之前只有一个结果,那么我必须在当前ID之后再添加3个插入的结果。这样,我将得到恒定的4个结果。感谢you@mihai:是否存在行删除的情况,如id是否为1 2 3 4 6 7 8 9,如id 5是否已删除?事实上,随着时间的推移,可能会有一些行id已被删除@babonk:这样更好,但如果某些行以前已删除,且行id不连续,则无法正常工作,参见以上注释。假设值为1 3 5 6 7 8。当它们输入5时,你想要哪个值?我想到了,但我不知道的是联合。我会研究一下的,谢谢:@Mihai:使用MySQL的UNION在这里不起作用,因为您不能指定跨越您要查找的范围的联合集的开始和结束。我想我只需要添加一个检查器,以查看当前记录之前或之后有多少行可用。。如果对大多数页面都这样做,将会消耗大量资源。。除非我定期缓存结果。。哦,孩子不管怎样,谢谢你,我可能会对这个联盟设定一个总的限制,就这样,即使这不能回答我最初的问题。