我需要从值到“距离”对表进行排序。
例如: 在DB中:
1
2
3
4
5
6
我需要什么(对于某些n值):
如果n = 3
:
3
2
4
1
5
6
如果n = 5
:
5
4
6
3
2
1
答案 0 :(得分:3)
两个值之间的距离可以定义为这些值之差的绝对值。
因此,如果您的专栏被调用,例如value
,您可以按照以下方式使用ABS()
功能,例如值3
:
SELECT value FROM my_table ORDER BY ABS(3 - value);
这会给你这个结果:
+-------+
| value |
+-------+
| 3 |
| 2 |
| 4 |
| 1 |
| 5 |
| 6 |
+-------+
或者值为5
:
SELECT value FROM my_table ORDER BY ABS(5 - value);
将产生:
+-------+
| value |
+-------+
| 5 |
| 4 |
| 6 |
| 3 |
| 2 |
| 1 |
+-------+
如果你想在PHP中进行排序,你可以这样做:
$a = [1, 2, 3, 4, 5, 6];
$n = 3;
usort($array, function($x, $y) {return(abs($n-$x) - abs($n-$y));});
答案 1 :(得分:2)
正如你在评论中所说:
通过增加表格
中n与值之间的差异进行排序
比那样做。 :)例如n=3
:
SELECT * FROM SomeTable ORDER BY ABS(3 - value) ASC, value ASC;
第一个订单将按n
和value
之间的距离排序,当距离相同时,第二个订单将按value
升序排序。
ABS() MySQL函数代表绝对值。你想使用它,因为差异等于例如2
和-2
距离相同,等于2
。
我根据你的例子假设的二阶条件。如果你不在乎,则不需要。
答案 2 :(得分:0)
在php中,您可以执行以下操作:
$array = (1,2,3,4,5,6);
//Find index
$key = array_search(3, $array); // $key = 2;
$up = true; //flags for traversal
$down = true;
$result = array();
for($i=1; $i<= count($array); $i++)
{
if(!empty($array[$key - $i]))
{
$result[] = $array[$key - $i];
}
if(!empty($array[$key + $i]))
{
$result[] = $array[$key + $i];
}
}
print_r($result);