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

sir*_*jay 1 php mysql sorting yii2

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

10
20
30
40
50
Run Code Online (Sandbox Code Playgroud)

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

40
30
50
20
10
Run Code Online (Sandbox Code Playgroud)

详细信息:|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]],
]);
Run Code Online (Sandbox Code Playgroud)

Rob*_*bel 6

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

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

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

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