我需要按最接近的值在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]],
]);
答案 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工作。