【问题标题】:Codeigniter MySQL select max using varchar type valueCodeigniter MySQL使用varchar类型值选择最大值
【发布时间】:2020-01-25 13:04:35
【问题描述】:

我想从我的 codeigniter 模型中的以下 varchar 类型列中选择 max auto_no

+------------+
|  auto_no   |
+------------+
| 2020-00821 |
| 2020-00822 |
| 2020-00823 |
| 2020-00824 |
| 2020-00825 |
+------------+ 

在此示例中,该值为 825。我尝试了以下选项

public function generate_auto_no($count = 1, $start = 00000, $digits = 5)
    {
        $query = $this->db->get('letter_letter');
        $this->db->select("MAX(CAST(SUBSTRING_INDEX(auto_no, '-', -1) AS UNSIGNED)) AS auto_no", FALSE);        
        $count = ($query->num_rows() > 0) ? $query->row()->auto_no + 1 : 0;
        $result = array();
        for ($n = $start; $n <= $start + $count; $n++) {
            $result[] = str_pad($n, $digits, "0", STR_PAD_LEFT);
        }
        return date("Y").'-' . end($result);
    }

但没有得到预期值。有人可以帮忙吗?

【问题讨论】:

  • 我很想修改架构,存储年份?和不?分别
  • 使用查询SELECT CAST(MAX(SUBSTRING(auto_no, -5)) AS UNSIGNED) AS max_no FROM auto_tableSQL Fiddle
  • @马丹。没关系。但是该函数应该包含在 $this->db->.......
  • 你可以这样做:) $this-&gt;db-&gt;select(..., false)。使用 false 作为第二个参数来接受原始 SQL。

标签: php mysql sql codeigniter max


【解决方案1】:

我觉得你可以选择最大字符串:

$this->db->select_max("auto_no");
$query = $this->db->get('letter_letter');
if ($query->num_rows() > 0) {
    $last_auto_no = $query->row()->auto_no;
    $no = intval(explode('-', $last_auto_no)[1]) + 1;
    $auto_no = date("Y").'-' . str_pad($no, $digits, "0", STR_PAD_LEFT);
} else {
    $auto_no = (date("Y").'-' . str_pad(0, $digits, "0", STR_PAD_LEFT));
}
return $auto_no

【讨论】:

  • @TsaiKoga。但它不包括表名。假设表为 letter_letter
  • @MCITTrends 然后使用get(table_name)
  • @TsaiKoga。但它将最小值重新运行为 2020-00001。编辑后的所有功能。请。编辑时查看
  • @MCITTrends 我认为您可以将auto_no 设为最大值并像我的帖子一样增加它。
  • @TsaiKoga。我认为这接近预期的输出。但出现错误,消息:未定义偏移量:1 文件名:models/Letter_model.php 行号:346
【解决方案2】:

可以通过使用MAX() 获取varchar 值然后提取最后5 个字符的数量来检索最大值:

select right(max(in_num), 5) + 0
from tablename

请参阅demo
结果:

825

【讨论】:

  • @forpas。您可以将您的建议添加到 $this->db->select_max()
  • @forpas。不,那不是。在 Codeigniter 中,应该在左边使用 $this->db->select_max
【解决方案3】:

一种选择是使用自定义查询:

$this->db->query(" SELECT MAX( CAST( SUBSTR(auto_no,INSTR(auto_no,'-')+1,LENGTH(auto_no)) AS SIGNED) ) FROM tab ");

包括著名的 MySQL DB 字符串运算符。

【讨论】:

    猜你喜欢
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 2011-08-28
    相关资源
    最近更新 更多