如何按最接近的数字排序?

时间:2015-07-25 05:09:49

标签: php mysql sorting yii2

我需要按最接近的值在php mysql表中排序/排序。例如,我有价格值表:

10
20
30
40
50

当我搜索37时,它必须返回最接近的地方:

40
30
50
20
10

详情:|40-37|=3 - 最近的。然后|30-37|=7 - 接下来。然后|50-37|=13。然后|20-37|=17 ...... 我们有3, 7, 13, 17....

否则,是否有内置方式在Yii2上执行此操作?

$query = Prices::find();
$dataProvider = new ActiveDataProvider([
    'query' => $query,
    'sort'=> ['defaultOrder' => ['price' => SORT_DESC]],
]);

1 个答案:

答案 0 :(得分:4)

在SQL级别,您要做的是按每行距离37的距离排序,例如ORDER BY ABS(value - 37) ASC(请参阅this SqlFiddle for an example)。

要在Yii2框架中应用它,您应该能够使用上面的表达式代替排序哈希键的列名:

$query = Prices::find();
$dataProvider = new ActiveDataProvider([
    'query' => $query,
    'sort'=> ['defaultOrder' => ['ABS(price - 37)' => SORT_ASC]],
]);

现在,假设37是一个参数,您需要将其插入到该表达式中。确保对其进行清理(例如,'ABS(price - ' . (int)$yourParam . ')'),否则您将自己打开SQL注入。此外,'sort'值仅适用于ActiveDataProvider;它不会为ArrayDataProvider工作。