Php 如何按最近的数字排序?
我需要在php mysql表中按最接近的值进行排序/排序。例如,我有一个带有价格值的表: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
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')代码>现在它可以工作了;史酷尔!你能用你的工作代码编辑我的答案吗?