2012-03-30 42 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. 添加数字列添加到数据库,并在插入值时在此新列中执行字符串到数字的分析。

第一个选项是令人难以置信的效率低下,第二个可能是你最好的选择。