从数据库 SQL 的唯一 ID 中获取最后一个数字 - PHP CodeIgniter

Posted

技术标签:

【中文标题】从数据库 SQL 的唯一 ID 中获取最后一个数字 - PHP CodeIgniter【英文标题】:Get last number from unique ID from database SQL - PHP CodeIgniter 【发布时间】:2016-04-13 12:47:13 【问题描述】:

向下滚动查看答案

我有这样的注册表: table 现在我跳到最后一位,例如:

SG20160412001 >> 1 SG20160412056 >> 56 SG20160412121 >> 121

目的是生成新的Reg_ID,例如:

如果返回的数据为 = 1,那么新的 Reg_ID 将为 SG20160412002 如果返回的数据为 = 56,那么新的 Reg_ID 将为 SG20160412057 如果返回的数据为 = 0,那么新的 reg_ID 将为 SG20160412001

这是我当前的代码:

public function generate_no_reg($nmNegara)
    
        $dtNow = date('Y-m-d');
        $query = 'SELECT COUNT(Reg)ID) FROM Registratrion WHERE Reg_Date="$dtNow"';
        $lastid = $this->db->query($query);
        $id = $lastid->num_rows()+1;
        $regCount = format_no_registrasi($id);

        $kode = $this->get_negara($nmNegara).$regCount;
        return $kode;

    

这是我当前生成最后 3 位数字的代码:

function format_no_registrasi($no)
   
    $leadingzeros = '000';
    $no_reg = date('Y') . date('m') . substr($leadingzeros, 0, (-strlen($no))) . $no+1;
    return $no_reg;

这段代码我遇到的问题是:

    当我删除一行时,主键会加倍,例如: SG20160412001 SG20160412002 现在数据计数返回 1,当我生成新数据时,它将是:SG20160412002

非常感谢任何帮助。对不起这个问题。

向下滚动查看答案

【问题讨论】:

【参考方案1】:

此查询从 Reg_ID 中删除 3 个最后的符号并返回最大值。

select max(cast(substr(Reg_ID, -3) as UNSIGNED))
from FROM Registratrion
WHERE Reg_Date="$dtNow"

所以 id 计数支持 ids 直到 999

【讨论】:

感谢您的最大回答,但它对我不起作用 是的,对不起。查询出现错误,我已修复【参考方案2】:

Max 的解决方案更干净。

不要使用计数,使用最大的数字。

创建 Reg_ID 的前导字符

$leadingCharacters = 'SG' + date('Ymd');

然后选择以此字符串开头的hightes Reg_ID:

select Reg_ID from Registration where Reg_ID like '$leadingCharacters%' order by Reg_ID desc limit 0,1

然后从结果中提取最后三位,将其转换为 int 并递增。这将是您的下一个 ID。

$number = (int) substr($result,-3);
$number++;

注意:代码是从内存中键入的,因此可能会有一点错误。但是这个概念应该可行

【讨论】:

【参考方案3】:

您是否考虑过将您的 reg_id 分成三列?

前缀 CHAR(2) reg_date DATE 后缀 SMALLINT UNSIGNED

如果需要,您可以使用代理或复合 PRIMARY,并在选择时连接列:

SELECT CONCAT(prefix, reg_date, LPAD(post_fix,3,'0')) reg_id 
  FROM registration

将单独的数据保存在单独的字段中可以省去很多此类操作的麻烦。

【讨论】:

【参考方案4】:

我的回答得到了 Markus 和 Max 的帮助

这是我用于引导字符的函数,因为“SG”来自数据库:

public function get_negara($nmNegara)
    
        $this->db->select('Kode_Negara');
        $this->db->from('tb_negara_tujuan');
        $this->db->where('Nama_Negara',$nmNegara);
        $query = $this->db->get();
        $result = $query->row();
        return $result->Kode_Negara . date('Ymd');
    
 // this will returning 'SG20160413'

这是用于将 1 转换为 001 的辅助函数:

function format_no_registrasi($no)
   
    $leadingzeros = '000';
    $no_reg = substr($leadingzeros, 0, (-strlen($no))) . $no;
    return $no_reg;

这是用于生成完整 Reg_ID 的函数:

public function generate_no_reg($nmNegara)
    
        $leadingChar = $this->get_negara($nmNegara);
        $this->db->select_max('No_Registrasi');
        $this->db->like('No_Registrasi',$leadingChar);
        $query = $this->db->get('tb_registrasi');
        $result = $query->row();
        $noreg = (int) substr($result->No_Registrasi,-3);
        $noreg++;
        return $kode = $leadingChar.format_no_registrasi($noreg);
    

【讨论】:

以上是关于从数据库 SQL 的唯一 ID 中获取最后一个数字 - PHP CodeIgniter的主要内容,如果未能解决你的问题,请参考以下文章

SQL 获取最后一次数字设置为 1

在 django 中获取最后插入的 id

在 SQL Server 和 C# 中获取最后插入的字符串 ID

在 sql 数据库中创建唯一列 id 的首选方法

如何在 vertica 中获取最后发布的序列 ID?

如何从点击的数字中获取值(数字)