如何从有序表中选择按列排序的上一行和下一行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] 删除。
我来说两句