当列是varchar时,在mysql中查找max

时间:2011-02-20 01:59:23

标签: mysql

我有一个varchar字段,它是字母代码并自动递增(manualy),所以A之后是B,直到Z变为AA之后等等。

我的问题是当我点击AA并尝试选择此字段的MAX时:

SELECT MAX(letter) from jobs

返回Z而不是AA。如果您要订购名称,这是正确的,但我有一个代码。有办法做到这一点吗?

4 个答案:

答案 0 :(得分:8)

试试这个。这将强制它将较长的字符串加权为高于较短的字符串:

SELECT letter
FROM jobs
ORDER BY LENGTH(letter) DESC, letter DESC
LIMIT 1;

编辑:是的,忘记对DESC进行排序以获得MAX ...

答案 1 :(得分:2)

这可能有帮助吗?先按长度排序,然后按字母排序。

SELECT letter FROM jobs
ORDER BY LENGTH(letter) DESC, letter DESC
LIMIT 0, 1

答案 2 :(得分:1)

由于您在最长字段的最大值之后,我将从以下内容开始。我不确定语法是否正确。基本上你必须忽略除最长列值之外的所有值。

select max(letter) from jobs
where len(letter) = (
    select max(len(letter)) from jobs
)

无论您选择哪种解决方案,都可以选择添加另一列来保存字母长度,并让它由插入/更新触发器控制(假设MySQL 具有)。

通过索引该列,您可以大大加快查询速度,因为您在select期间删除了每行功能。产生成本的合适时间是数据发生变化,以便计算成本在所有读数中摊销。

这在数据库编写频率高于阅读的情况下不起作用,但在我的经验中它们相对较少。

答案 3 :(得分:0)

你的田地有最大长度吗?如果是这样,您是否也可以正确地证明该领域的数据?可能的答案是(1)凭经验'是',5可能是较高的长度,(2)不是真的。但是,如果你能够对两者说“是”,那么你就可以使用它(盒子是空白的):

  • '☐☐☐☐A'
  • ...
  • '☐☐☐☐Z'
  • '☐☐☐AA'
  • '☐☐☐AB'
  • ...
  • '☐☐☐BA'
  • ...
  • '☐☐☐ZZ'
  • '☐☐AAA'

实际上,这对你来说可能并不合适,因此它无济于事。