查找两个varchar字段的最大数值

时间:2012-03-30 22:17:44

标签: php mysql arrays codeigniter

我正在尝试查找表格中两个单独字段中包含的最大值。

我在我的模型中使用的代码是:

$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?

如果有,有办法在检查最大值之前将字段内容强制转换为整数,并且这会受到字段中非整数值的影响吗?

感谢所有的帮助和建议。

贝。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

哦,哎呀,我忘记了mysql部分 你应该做同样的事情,转换为整数:

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']);

查看string to int conversion

上的PHP文档

答案 2 :(得分:-1)

你真正要求的是codeigniter将字符串转换为数字的方法,并找到它们的最大值。我不知道在codeigniter中有什么方法可以做到这一点。

如果你真的想要这个,你有两个选择:

  1. 循环遍历表中的所有行,并使用php解析数字,同时寻找最大数字
  2. 向数据库添加一个数字列,并在插入值时在此新列中执行字符串到数字的解析。
  3. 第一个选项令人难以置信效率低下,第二个选项可能是你最好的选择。