我将数字保存为字符串,因为它们通常大于MySQL允许整数的最大限制。
我想要获得的是此列中最小和最大的值,但只是比较字符串会返回非常不同的结果。
我试图像我这样在我的查询中添加一个CONVERT子句:
"SELECT end_timestamp FROM ".$db_table_prefix."user_events ORDER BY CONVERT('end_timestamp', SIGNED INTEGER) DESC LIMIT 1"
但结果却不正确。我认为CONVERT子句不会按照我期望的方式转换为整数。
那么将字符串转换为整数并获得最小值的最佳方法是什么?
答案 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实例。
您还可能需要考虑更适合时间戳的数据类型,例如TIMESTAMP
或DATETIME
,这些数据类型可能会在数据库外部转换为您需要的格式。