【问题标题】:How to sort data to both directions?如何对数据进行双向排序?
【发布时间】:2017-06-25 19:39:49
【问题描述】:

我需要按值的“距离”对表格进行排序。


例如: 在数据库中:

1
2
3
4
5
6


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

3
2
4
1
5
6


如果n = 5:

5
4
6
3
2
1

【问题讨论】:

  • 每次排序的规则是什么?它看起来不像“排序
  • 通过增加n与表中值的差来排序

标签: php mysql sql indexing


【解决方案1】:

两个值之间的距离可以定义为这些值之间差异的绝对值。

因此,如果您的列被称为例如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));});

【讨论】:

    【解决方案2】:

    正如你在评论中所说:

    通过增加表中n与值的差进行排序

    比那样做。 :) 例如对于n=3

    SELECT * FROM SomeTable ORDER BY ABS(3 - value) ASC, value ASC;
    

    第一个顺序是nvalue之间的距离排序,第二个是value升序排序,当距离相同时。

    ABS() MySQL 函数代表绝对值。您想使用它,因为差异等于例如2-2 距离相同,等于2

    我根据您的示例假设的二阶条件。如果您不在乎,则不需要。

    【讨论】:

      【解决方案3】:

      在 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);
      

      【讨论】:

      • 或者只是usort($array, function($x, $y) {return(abs(3-$x) - abs(3-$y));});
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 2017-06-14
      相关资源
      最近更新 更多