从包含数字作为字符串的列获取最小值

时间:2013-08-31 12:48:05

标签: mysql casting

我将数字保存为字符串,因为它们通常大于MySQL允许整数的最大限制。

我想要获得的是此列中最小和最大的值,但只是比较字符串会返回非常不同的结果。

我试图像我这样在我的查询中添加一个CONVERT子句:

"SELECT end_timestamp FROM ".$db_table_prefix."user_events ORDER BY CONVERT('end_timestamp', SIGNED INTEGER) DESC LIMIT 1"

但结果却不正确。我认为CONVERT子句不会按照我期望的方式转换为整数。

那么将字符串转换为整数并获得最小值的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

如果您有一个数字作为字符串并且它是一个没有前导0的整数,您可以通过首先比较长度然后比较值来比较它。例如,以下内容将按col1正确排序(假设如上):

select t.*
from t
order by char_length(col1), col1;

因此,获得最低限度的一种方法是:

select col1
from t
order by char_length(col1), col1
limit 1;

你也可以通过以下方式获得group by

select substring_index(group_concat(col1 order by char_length(col1), col1), ',', 1
                      ) as mincol1,
       substring_index(group_concat(col1 order by char_length(col1) desc, col1 desc), ',', 1
                      ) as maxcol1
from t;

如果你在数字和/或小数位前面有零,那么这些想法是相同的,但编码有点复杂。

答案 1 :(得分:1)

我没有要测试的MySQL实例,但看起来解决方法可能会解决您的问题。我不知道这里的问题是数字对于转换来说太大了,但是如果它们不能在数据库中整数,为什么有可能将它们转换为数据库外的整数呢?

尝试这样的事情:

"SELECT end_timestamp FROM ".$db_table_prefix."user_events ORDER BY CHAR_LENGTH(end_timestamp) DESC, end_timestamp DESC LIMIT 1"

这将首先按字符数排序,即数字上的字符串排序分开(只要您没有任何前导零),然后对数字长度相同的数字排序。如果仍然不起作用,您可能需要`SELECT CHAR_LENGTH(end_timestamp)AS ts_len'来计算sort命令之外的值。这是我真的不知道哪个会起作用,因为我没有可用于测试的MySQL实例。

您还可能需要考虑更适合时间戳的数据类型,例如TIMESTAMPDATETIME,这些数据类型可能会在数据库外部转换为您需要的格式。