Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.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,这可能是一个重复的问题,但问题过于笼统,且该问题适用于特定情况 首先,我想有两个选择,哪一个更好 性能方面。第一个是使用分离查询获取上一行和下一行。以下是一个伪代码: sql->query("SELECT * FROM tbldata WHERE id < 3 ORDER BY id DESC LIMIT 1"); $prev = sql->getRecord(); sql->query("SELECT * FROM tbldata WHERE id > 3 ORD

这可能是一个重复的问题,但问题过于笼统,且该问题适用于特定情况

首先,我想有两个选择,哪一个更好 性能方面。第一个是使用分离查询获取上一行和下一行。以下是一个伪代码:

sql->query("SELECT * FROM tbldata WHERE id < 3 ORDER BY id DESC LIMIT 1");
$prev = sql->getRecord();
sql->query("SELECT * FROM tbldata WHERE id > 3 ORDER BY id LIMIT 1");
$next = sql->getRecord();
另一种解决方案是只使用一个带有UNION的查询

sql->query("(SELECT * FROM tbldata WHERE id > 3 ORDER BY id DESC LIMIT 1) UNION
            (SELECT * FROM tbldata WHERE id < 3 ORDER BY id LIMIT 1)");
$row = sql->getRecords();
if (count($row) > 1) {
   $prev = $row[0];
   $next = $row[1];
} elseif (count($row) == 0) {
} elseif ($row[0]->id > 3) {
   $next = $row[0];
} else {
   $prev = $row[0];
}

对于这种类型的问题,哪一种是最佳实践?

如果我不得不猜测的话,UNION整体上可能更快,只是因为它减少了对数据库的请求数量,但我强调,这是一种猜测,它将取决于许多因素,唯一知道的方法是分析代码并进行检查

事实上,这可能没什么区别。除非出现异常情况,例如与数据库服务器的连接速度非常慢


我的建议是,在有理由更改代码之前,使用使代码更整洁和更易于阅读的代码-即,直到您的系统配置文件表明这是系统中的瓶颈。

如果我不得不猜测的话,UNION总体上可能更快,只是因为它减少了对数据库的请求数量,但我强调,这是一个猜测,它将取决于许多因素,唯一知道的方法是分析代码并进行检查

$sql->query('SELECT t.*
             FROM table t
             WHERE t.id IN ('.($id-1).', '.($id+1).')');
$rows = sql->getRecords();

$next = $prev = false;

if (is_array($rows) && $rows) {
    $next = $rows[0];

    if (isset($rows[1])) {
        $prev = $rows[1];         
    } elseif ($rows[0]->id < $id) {
        $prev = $next;
        $next = false;
    }
}
事实上,这可能没什么区别。除非出现异常情况,例如与数据库服务器的连接速度非常慢

我的建议是,在有理由更改代码之前,使用使代码更整洁和更易于阅读的代码-即,直到您的系统分析表明这是系统中的瓶颈

$sql->query('SELECT t.*
             FROM table t
             WHERE t.id IN ('.($id-1).', '.($id+1).')');
$rows = sql->getRecords();

$next = $prev = false;

if (is_array($rows) && $rows) {
    $next = $rows[0];

    if (isset($rows[1])) {
        $prev = $rows[1];         
    } elseif ($rows[0]->id < $id) {
        $prev = $next;
        $next = false;
    }
}
如果id是主键,则一个带有主索引的请求。比联盟或2个请求更好


如果id是主键,则一个带有主索引的请求。比联合会或两个请求要好。

根据我的经验,我认为联合会比另一个更快

试试这个

SELECT * , IF( id >3, 1, 0 ) AS NextFlag, IF( id <3, 1, 0 ) AS PrevFlag FROM tbldata
WHERE id <= 3+1
HAVING NextFlag =1
OR PrevFlag =1
ORDER BY id DESC
LIMIT 2 

根据我的经验,我认为工会比其他工会更快

试试这个

SELECT * , IF( id >3, 1, 0 ) AS NextFlag, IF( id <3, 1, 0 ) AS PrevFlag FROM tbldata
WHERE id <= 3+1
HAVING NextFlag =1
OR PrevFlag =1
ORDER BY id DESC
LIMIT 2 

看看MySQL-下一个/上一个ID和循环看看MySQL-下一个/上一个ID和循环主键总是顺序的,不是吗?当然,您可以随时按t.id ASC添加订单。如果行已被删除,则不能添加订单。如果您未在id字段上使用自动增量,则不能添加订单。主键总是按顺序排列的,不是吗?当然,您始终可以按t.id ASC添加订单。如果行已被删除,或者您未在id字段上使用自动增量,则不能添加订单。