0

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

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

我试图向我的查询添加一个 CONVERT 子句,如下所示:

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

但是通过的结果是不正确的。我认为 CONVERT 子句没有按照我期望的方式转换为整数。

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

4

2 回答 2

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;

如果数字和/或小数位前面有零,想法是一样的,但编码有点复杂。

于 2013-08-31T12:53:39.837 回答
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' 来计算排序命令之外的值。那是我真的不知道哪个会起作用的地方,因为我没有可用于测试的 MySQL 实例。

您可能还需要考虑更适合时间戳的数据类型,例如TIMESTAMPor DATETIME,一旦它们在数据库之外,它可能会转换为您需要的格式。

于 2013-08-31T13:01:13.550 回答