これは、質問が一般的すぎることを除いて、mysqlユニオンと複数のクエリの重複した質問である可能性があり、この質問は特定のケースです。
まず、性能面でどちらが優れているかを考えている2つの選択肢があります。最初のものは、分離されたクエリで前と次の行を取得しています。以下は疑似コードです。
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();
もう 1 つの解決策は、UNION でクエリを 1 つだけ使用することです。
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];
}
このタイプの問題のベストプラクティスはどれですか?