这可能是mysql union vs multiple queries的重复问题,除了问题太笼统,这个问题针对特定情况。
首先,我认为有两种选择,哪种选择更好 表现明智。第一个是使用分开的查询获取上一行和下一行。以下是伪代码:
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];
}
对于此类问题,哪一个是最佳做法?
答案 0 :(得分:1)
如果我不得不猜测,UNION整体可能更快,只是因为它减少了对数据库的请求数量,但我强调,这是一个猜测,它将取决于许多因素,唯一的方法是知道是分析代码并检查。
实际上,它可能差别很小。除非存在异常情况,例如与数据库服务器的连接速度非常慢。
我的建议是,使用哪个使代码更整洁,更容易阅读,直到有理由改变它 - 即。直到系统分析表明这是系统中的瓶颈。
答案 1 :(得分:1)
根据我的经验,我认为UNION
比其他人更快。
并试试这个。
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
答案 2 :(得分:-1)
$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;
}
}
一个带PRIMARY索引的请求(如果id是您的PRIMARY KEY)。优于UNION或2个请求。