2012-03-30 77 views
1

我試圖找到包含在我的表的兩個單獨字段中的最大值。查找兩個varchar字段的最大數值

我用在我的模型代碼是:

$query = $this->db->query("select max($field1) as max_id_1 from default_table1"); 
$row1 = $query->row_array(); 
$query = $this->db->query("select max($field2) as max_id_2 from default_table1"); 
$row2 = $query->row_array(); 
return max($row1['max_id_1'], $row2['max_id_2']); 

我一個完整的新手,其中PHP和CodeIgniter的關注 - 因爲我相信我的代碼演示了:)

它正在工作,因爲它是返回值,但不是我在字段中的最大值。例如,我知道有一個4000的值,但返回的最高是750.

我想知道這是否是因爲字段的類型爲VARCHAR,因爲雖然他們主要包含數字有一些包含字符( - 或& )或單詞'to',所以我不能使用INT類型。 由於使用VARCHAR,它沒有看到4000大於750?

如果是的話,是否有辦法在檢查最大值之前將字段內容轉換爲整數,並且這會受到字段中非整數值的影響?

感謝您提供所有的幫助和建議。

Tony。

回答

1

這可以使用SQL中使用MySQL的隱式類型轉換來完成:

select max(case when (field1+0)>(field2+0) then field1+0 else field2+0 end) 
from default_table1 

使用+0將VARCHAR轉換爲數字,也忽視了號碼後跟隨的任何字符。如果你仍然需要原始內容,你可以這樣寫:

select case when (field1+0)>(field2+0) then field1 else field2 end 
from default_table1 
order by case when (field1+0)>(field2+0) then field1+0 else field2+0 end desc 
limit 1 
+0

感謝@米蘭。它正在工作 - 當然比我想出的代碼更好 - 但是如果比較是在數字和空值之間(例如$ field1 = 4000,$ field2 = NULL),它似乎沒有取得最大值。這是預期的嗎?任何想法如何克服這一點?再次感謝你的幫助。 – tcarnell 2012-03-31 10:33:16

+1

當然,使用COALESCE。而不是field1和field2使用COALESCE(field1,0)和COALESCE(field2,0) – 2012-03-31 21:14:27

+1

Superb @milan。這工作出色:)非常感謝您的幫助,非常感謝。 – tcarnell 2012-04-01 10:27:59

0

哦,哎呀,我忘了MySQL的部分 你應該做同樣的事情,轉換成integer:

select max(cast($field1 to unsigned)) as max_id_1 from default_table1 

這取決於你的數據,但您可以嘗試類似的東西

return max((int)$row1['max_id_1'], (int)$row2['max_id_2']); 

看一看到PHP文檔上string to int conversion

+0

這是行不通的,因爲他在查詢VARCHAR列期間正在執行max()。他爲$ row1 ['max_id_1']'AND'$ row2 ['max_id_2']'獲得的值可能無效。充其量,最多隻能提供兩個數字的最大值,這不是數據庫中的最大數字,因此也不能解決問題。 – cegfault 2012-03-30 22:31:32

+0

是的,在您的評論之前我已經看過30秒了:)謝謝 – haltabush 2012-03-30 22:32:36

-1

什麼你真的要求的是codeigniter將字符串轉換爲數字的方式,並找到這些字符串的最大值。我不知道有什麼方法可以在codeigniter中做到這一點。

如果你真的想這樣,你有兩個選擇:

  1. 遍歷表中的所有行,並使用PHP來解析出數量,同時尋找最大數
  2. 添加數字列添加到數據庫,並在插入值時在此新列中執行字符串到數字的分析。

第一個選項是令人難以置信的效率低下,第二個可能是你最好的選擇。