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

时间:2016-04-13 12:47:14

标签: php mysql codeigniter

向下滚动以找到答案

我有这样的注册表: 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;
}

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

  1. 当我删除一行时,主键将加倍,例如:
    • SG20160412001<<我删除了这个
    • SG20160412002
  2. 现在数据计数返回1,当我生成新数据时,它将是:SG20160412002
  3. 非常感谢任何帮助。抱歉,这个问题。

    向下滚动以找到答案

4 个答案:

答案 0 :(得分:2)

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

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

所以id计算支持id到999

答案 1 :(得分:0)

Max'解决方案更清晰。

请勿使用计数,请使用最高数字。

创建Reg_ID的主要字符

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

然后选择以此字符串开头的高位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++;

注意:从内存中输入代码,因此可能会出现一点错误。但这个概念应该有用

答案 2 :(得分:0)

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

  • 前缀CHAR(2)
  • reg_date DATE
  • postfix SMALLINT UNSIGNED

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

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

在单独的字段中保存单独的数据可以为这样的操作节省很多麻烦。

答案 3 :(得分:0)

我的答案得到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);
    }
相关问题