哪些最佳选择语句可以选择一个语句中的上一行和下一行?

低级

如何从有序表中选择排序的上一行下一行order

这是这样一个表的简单示例(例如test_table):

+--------+-----------+----------+
| id     | name      | order    |
+--------+-----------+----------+
|    126 | Test 0    |        0 |
+--------+-----------+----------+
|     73 | Test 1    |        1 | >
+--------+-----------+----------+
|    801 | Test 5    |        5 | <<<
+--------+-----------+----------+
|      3 | Test 8    |        8 | >
+--------+-----------+----------+
|     45 | Test 12   |       12 |
+--------+-----------+----------+

这是一个示例语句,可以执行我需要的操作(在此示例中,我具有order-value 5,并且需要通过来添加上一行和下一行order):

SELECT * FROM
    (
        SELECT * FROM test_table
        WHERE test_table.order < 5
        ORDER BY test_table.order DESC LIMIT 1
    ) AS a

UNION

SELECT * FROM
    (
        SELECT * FROM test_table
        WHERE test_table.order > 5
        ORDER BY test_table.order LIMIT 1
    ) AS b

但是,我认为这太复杂了。还有另一种方法可以使用更少selects(和/或不使用union)吗?简而言之:是否有更多的性能/效率和最佳陈述/算法或一些最佳实践?


更清楚地说,我期望以下结果集:

+--------+-----------+----------+
| id     | name      | order    |
+--------+-----------+----------+
|     73 | Test 1    |        1 |
+--------+-----------+----------+
|      3 | Test 8    |        8 |
+--------+-----------+----------+

PS:请不要使用任何程序或自定义功能。假定没有适当的管理员权限。

保罗·斯皮格尔

如我所见,您的解决方案已经是最佳的。我会写得短一些,UNION ALL而不是使用UNION(这是的快捷方式UNION DISTINCT):

(
    SELECT * FROM test_table
    WHERE test_table.order < 5
    ORDER BY test_table.order DESC LIMIT 1
) UNION ALL (
    SELECT * FROM test_table
    WHERE test_table.order > 5
    ORDER BY test_table.order LIMIT 1
)

给定order上的索引,它也应具有最佳性能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章