Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何按最近的数字排序?_Php_Mysql_Sorting_Yii2 - Fatal编程技术网

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

Php 如何按最近的数字排序?,php,mysql,sorting,yii2,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 Activ

我需要在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]],
]);

在SQL级别,您要做的是按照每行与37之间的距离进行排序,例如,
orderbyabs(value-37)ASC
(请参阅)

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

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

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

在SQL级别,您要做的是按每行与37之间的距离排序,例如,
按ABS(值-37)ASC排序(请参阅)

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

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

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

您的意思是在所有情况下,两个最接近的数字描述,然后是其他描述?我详细说明了排序的工作方式您的意思是在所有情况下,两个最接近的数字描述,然后是其他描述?我详细说明了如何排序works@sirjay您使用的是ActiveDataProvider还是其他数据提供程序?您在哪个数据库上运行?ActiveDataProvider(与上面的代码相同)。Mysql。也许我们应该尝试使用
$query->andFilterWhere(['…','price',$this->price])?我想我明白了。Yii2中的
sort
实现可能试图在您的模型上查找
ABS(price-37)
列,但失败了。您关于在将查询传递给ADP之前对其排序的建议听起来不错,不过。。。怎么样:
$query=Prices::find()->addOrderBy(“ABS('price-37')ASC”)
?我制作了这个
->addOrderBy('ABS(price-37)ASC')现在它可以工作了;史酷尔!您能用您的工作代码编辑我的答案吗?@sirjay您使用的是ActiveDataProvider还是其他数据提供程序?您在哪个数据库上运行?ActiveDataProvider(与上面的代码相同)。Mysql。也许我们应该尝试使用
$query->andFilterWhere(['…','price',$this->price])?我想我明白了。Yii2中的
sort
实现可能试图在您的模型上查找
ABS(price-37)
列,但失败了。您关于在将查询传递给ADP之前对其排序的建议听起来不错,不过。。。怎么样:
$query=Prices::find()->addOrderBy(“ABS('price-37')ASC”)
?我制作了这个
->addOrderBy('ABS(price-37)ASC')现在它可以工作了;史酷尔!你能用你的工作代码编辑我的答案吗?