SQL在VARCHAR类型列中查找MAX编号

时间:2017-12-05 14:06:38

标签: php sql select numbers max

我有SQL表,我有列DISTANCE(varchar50)。这是带点的数字。

+----+--------+--------+----------+
| ID | USERID | MONTH  | DISTANCE |
+----+--------+--------+----------+
| 1  |    1   | 201707 |   7.25   |
+----+--------+--------+----------+
| 2  |    2   | 201707 |   9.17   |
+----+--------+--------+----------+
| 3  |    2   | 201707 |  10.31   |
+----+--------+--------+----------+
| 4  |    1   | 201706 |  10.08   |
+----+--------+--------+----------+

我想显示MAX值od DISTANCE。如果我按距离DESC进行ORDER,结果为:

SELECT * FROM mytable ORDER BY distance DESC
9.17
7.25
10.31
10.08

我试图找到MAX但仍然不正确

SELECT MAX(distance) AS mvzd FROM mytable
9.17

如何使用提供的样本数据获得正确的最大距离值10.31

2 个答案:

答案 0 :(得分:2)

PROBLEM

SOLUTION

您可以使用以下查询:

select max(cast(distance as decimal(10,2))) AS mvzd FROM mytable

根据您现有的查询,您在MAX类型列上找到了VARCHAR,并且您获得了正确的结果!如果你想得到你想要的结果,首先你必须转换那个列的类型,就像我在上面的查询中所做的那样。

答案 1 :(得分:0)

问题是您使用DISTANCE错误数据类型。在您的情况下,您将距离值存储为varchar以及ORDER BYMAX()函数无法按预期工作的原因 - 在这种情况下,ORDER BY是将值排序为第一个字符的字符串。在你的例子中,你试图按从低到大的顺序排序 - 这将给你"意外"结果如果有值像98.76或111.15。

您只需要将DISTANCE列的数据类型设置为 float - 一个带浮动小数点的小数字。

更改表格的设置以使用float

ALTER TABLE `mytable`
  CHANGE COLUMN `distance` `distance` 
  FLOAT NULL DEFAULT NULL AFTER `month`;

存储为float的数据将支持所有本机功能,例如MIN,MAX,ORDER BY等,这些功能将按预期工作,无需任何解决方法。

以下是使用float更正的示例:http://sqlfiddle.com/#!9/1f8692/1
以下是使用错误varchar(50)http://sqlfiddle.com/#!9/4da754e/1

的扩展示例