【问题标题】:Find Max numeric value of two varchar fields查找两个 varchar 字段的最大数值
【发布时间】:2012-03-30 22:17:44
【问题描述】:

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

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

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

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

我们非常感谢所有提供的帮助和建议。

托尼。

【问题讨论】:

    标签: php mysql arrays codeigniter


    【解决方案1】:

    这可以通过使用 MySQL 的隐式类型转换的 SQL 来完成:

    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
    

    【讨论】:

    • 感谢@milan。它正在工作 - 当然比我想出的代码更好 - 但如果比较是在数字和空值之间(例如 $field1 = 4000,$field2 = NULL),它似乎没有获得最大值。这是可以预期的吗?任何想法如何克服这个问题?再次感谢您的帮助。
    • 当然,使用 COALESCE。而不是 field1 和 field2 使用 COALESCE(field1,0) 和 COALESCE(field2,0)
    • 精湛的@milan。效果很好 :) 非常感谢您的帮助,非常感谢。
    【解决方案2】:

    哦,糟糕,我忘记了 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 文档

    【讨论】:

    • 这行不通,因为他在查询 VARCHAR 列期间正在执行 max()。他为$row1['max_id_1']$row2['max_id_2'] 获得的值可能无效。您最多提供两个数字中的最大值,这不是数据库中的最大数字,因此不能解决问题
    • 是的,在您发表评论之前,我已经看到了 30 多岁 :) 无论如何,谢谢您
    【解决方案3】:

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

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

    1. 循环遍历表中的所有行,并使用php解析出数字,同时寻找最大的数字
    2. 向数据库添加一个数字列,并在插入值时在此新列中进行字符串到数字的解析。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多