我有一個varchar字段是字母代碼和是自動遞增(manualy),所以後A是B,直到後Ž變得AA等。查找最大值在MySQL當列是VARCHAR
我的問題是,當我打AA,我儘量選擇這一領域的MAX:
SELECT MAX(letter) from jobs
返回的ž代替AA。如果您要訂購名稱,這是正確的,但我有一個代碼。有一種方法可以解決這個問題嗎?
我有一個varchar字段是字母代碼和是自動遞增(manualy),所以後A是B,直到後Ž變得AA等。查找最大值在MySQL當列是VARCHAR
我的問題是,當我打AA,我儘量選擇這一領域的MAX:
SELECT MAX(letter) from jobs
返回的ž代替AA。如果您要訂購名稱,這是正確的,但我有一個代碼。有一種方法可以解決這個問題嗎?
這可以幫助?先按長度排序,然後按字母排序。
SELECT letter FROM jobs
ORDER BY LENGTH(letter) DESC, letter DESC
LIMIT 0, 1
試試這個。這將迫使它重量更長的字符串作爲比短弦高:
SELECT letter
FROM jobs
ORDER BY LENGTH(letter) DESC, letter DESC
LIMIT 1;
編輯:是啊,忘了因爲你的最大後排序DESC得到MAX ...
+1,這比我的子查詢解決方案更好。要想避免每行函數的性能殺手,需要記住的一件事是創建另一個名爲letter_len的列,該列由插入/更新觸發器填充,然後在order by子句中使用該列。這將在所有讀取操作中分攤計算成本(在數據更改時完成),從而大大加快查詢速度。 – paxdiablo
它的工作原理。非常感謝你。 –
最長字段,我會從類似下面的內容開始。我不確定語法是否正確。基本上你必須忽略除最長列值之外的所有值。
select max(letter) from jobs
where len(letter) = (
select max(len(letter)) from jobs
)
無論您選擇哪種解決方案,考慮增加另一列,以保存字母長度的選項,並經插入/更新觸發器控制(假設MySQL的有這一點)。
編制索引的列,可以大大加快您的查詢,因爲您在select
刪除每行的功能。產生成本的正確時間是數據發生變化時,計算成本在所有讀取中攤銷。
這不會在數據庫中寫入往往比閱讀的情況下工作,但他們在我的經驗比較少見。
你有你的領域的最大長度?如果是這樣,你是否也可以對該領域的數據進行右對齊?可能的答案是(1)憑經驗'是',5可能是上限,(2)不是真的。但是,是你能說「是」兩個,那麼你就可以使用這個(其中框是空白):
實際上,這可能不會對您確定的,因此它不會幫助。
這仍然要給用於輸入設置[A..Z,AA】Z。 – paxdiablo
對不起,編輯後,我意識到我是愚蠢的,因爲沒有正確閱讀。 – jocull