我想按最近的数字排序

时间:2014-01-29 06:42:25

标签: php mysql

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)";

2 个答案:

答案 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)