2011-02-20 94 views
7

我有一個varchar字段是字母代碼和是自動遞增(manualy),所以後A是B,直到後Ž變得AA等。查找最大值在MySQL當列是VARCHAR

我的問題是,當我打AA,我儘量選擇這一領域的MAX:

SELECT MAX(letter) from jobs 

返回的ž代替AA。如果您要訂購名稱,這是正確的,但我有一個代碼。有一種方法可以解決這個問題嗎?

回答

2

這可以幫助?先按長度排序,然後按字母排序。

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

這仍然要給用於輸入設置[A..Z,AA】Z。 – paxdiablo

+0

對不起,編輯後,我意識到我是愚蠢的,因爲沒有正確閱讀。 – jocull

8

試試這個。這將迫使它重量更長的字符串作爲比短弦高:

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

編輯:是啊,忘了因爲你的最大後排序DESC得到MAX ...

+0

+1,這比我的子查詢解決方案更好。要想避免每行函數的性能殺手,需要記住的一件事是創建另一個名爲letter_len的列,該列由插入/更新觸發器填充,然後在order by子句中使用該列。這將在所有讀取操作中分攤計算成本(在數據更改時完成),從而大大加快查詢速度。 – paxdiablo

+0

它的工作原理。非常感謝你。 –

1

最長字段,我會從類似下面的內容開始。我不確定語法是否正確。基本上你必須忽略除最長列值之外的所有值。

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

無論您選擇哪種解決方案,考慮增加另一列,以保存字母長度的選項,並經插入/更新觸發器控制(假設MySQL的這一點)。

編制索引的列,可以大大加快您的查詢,因爲您在select刪除每行的功能。產生成本的正確時間是數據發生變化時,計算成本在所有讀取中攤銷。

這不會在數據庫中寫入往往比閱讀的情況下工作,但他們在我的經驗比較少見。

0

你有你的領域的最大長度?如果是這樣,你是否也可以對該領域的數據進行右對齊?可能的答案是(1)憑經驗'是',5可能是上限,(2)不是真的。但是,是你能說「是」兩個,那麼你就可以使用這個(其中框是空白):

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

實際上,這可能不會對您確定的,因此它不會幫助。