如何将数据分类到两个方向?

时间:2017-02-08 09:09:28

标签: php mysql sql indexing

我需要从值到“距离”对表进行排序。

例如: 在DB中:

1
2
3
4
5
6


我需要什么(对于某些n值):
如果n = 3

3
2
4
1
5
6


如果n = 5

5
4
6
3
2
1

3 个答案:

答案 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;

第一个订单将按nvalue之间的距离排序,当距离相同时,第二个订单将按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);