database name:property
column name :details
row 1 :house 5000
row 2 :land 25000
row 3 :bungalow 10000
row 4 :shop 15000
row 5 :godown 20000
row 6 :30000
row 7 :40000
该列包含文本和数字。我想用最接近的数字对它们进行排序。例如,如果我想按$ number = 10000排序。我需要的结果如下所示。
1) bungalow 10000
2) shop 15000
3) house 5000
4) godown 20000
5) land 25000
6) 30000
7) 40000
任何人都可以帮我这样的代码。
$sql="select * from property ORDER BY abs(details-$number)";
答案 0 :(得分:1)
你可以这样做
SELECT *
FROM property
ORDER BY ABS(SUBSTRING_INDEX(details, ' ', -1) * 1 - 10000), details
输出:
| DETAILS | |----------------| | bungalow 10000 | | house 5000 | | shop 15000 | | godown 20000 | | land 25000 | | 30000 | | 40000 |
这是 SQLFiddle 演示
在php中它看起来像
$sql = "SELECT *
FROM property
ORDER BY ABS(SUBSTRING_INDEX(details, ' ', -1) * 1 - $number), details";
注意:考虑使用 prepared statements 而不是插入查询字符串。
答案 1 :(得分:0)
由于这是一个mysql问题,并且您希望在纯SQL中得到答案,因此您首先需要一个合适的表。我将从以下开始:
mysql> show create table property;
...
CREATE TABLE `property` (
`type` varchar(250) DEFAULT NULL,
`value` int(11) DEFAULT NULL
)
现在让我们创建数据:
mysql> insert into property values ('home', 5000);
mysql> insert into property values ('land', 25000);
mysql> insert into property values ('bungalow', 10000);
mysql> insert into property values ('shop', 15000);
mysql> insert into property values ('godown', 20000);
mysql> insert into property values (NULL, 30000);
mysql> insert into property values (NULL, 40000);
现在让我们定义我们在mysql中使用的变量来表示原点:
mysql> set @origin = 10000;
Query OK, 0 rows affected (0.00 sec)
您可以这样编写纯sql语句:
mysql> select *, abs(value - @origin) distance
from property
order by 3 asc, 2 desc;
+----------+-------+----------+
| type | value | distance |
+----------+-------+----------+
| bungalow | 10000 | 0 |
| shop | 15000 | 5000 |
| home | 5000 | 5000 |
| godown | 20000 | 10000 |
| land | 25000 | 15000 |
| NULL | 30000 | 20000 |
| NULL | 40000 | 30000 |
+----------+-------+----------+
7 rows in set (0.00 sec)