在mysql中,如何在另一个查询语句中使用SELECT MONTH(now())函数? \ n
我问这个因为我必须创建一个具有独特格式的表单。
格式为XXX / IT /月/ no_request。
XXX:是我的公司,IT是我的部门,月份是1月到12月, no_request是auto_increment数字
所以,这是我的故事板。 我创建了一个名为tbl_request的表,如下所示:
CREATE TABLE `tbl_request` (
`id_request` varchar(15) NOT NULL,
`id_user` int(4) NOT NULL,
`name_user` varchar(50) NOT NULL,
PRIMARY KEY (`id_request`),
KEY `id_user` (`id_user`),
CONSTRAINT `tbl_request_ibfk_1` FOREIGN KEY (`id_user`) REFERENCES `tbl_user` (`id_user`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
我正在使用codeigniter开发此应用, 现在,我创建了表示tbl_request的模型。现在,这是获取id的功能。
public function getID(){
$this->load->helper('date');
$datestring = "%m";
$time = time();
$month = mdate($datestring, $time);
$query = $this->db->query("SELECT max(id_request) as max_id FROM tbl_request WHERE id_request LIKE '%TMS/IT/MONTH(NOW())/%' ");
$id = $query->row();
$no = (int) substr($id->max_id, 10,3);
$no++;
$idrequest = "TMS/IT/$month/".sprintf("%03s", $no);
return $idrequest;
}
public function insertRequest($id_request, $id_user, $name_user){
$query = INSERT INTO `tbl_request` VALUES ('$id_request',
'$id_user',
'$nama_user');
return $query;
}
所以,在控制器中,我只写这个:
$id_request = $this->model_request->getID();
$insert_data = $this->model_request->insertRequest($id_request, id_user, username);
最大的问题是:这段代码给我一个错误:
Error Number: 1062
Duplicate entry 'TMS/IT/12/001' for key 'PRIMARY'
我认为,我的代码不在这一行:
$query = $this->db->query("SELECT max(id_request) as max_id FROM tbl_request WHERE id_request LIKE '%TMS/IT/MONTH(NOW())/%' ");
N.P:现在,我只能插入一行XXX / IT / 12/001,接下来就像002失败一样。 我怎样才能做到这一点?
答案 0 :(得分:0)
你的算法有点不对劲。 如果你想使用max,where和no ++ yo必须使用id的整数。
您必须使用整数id,并合并字符串。
实施例 id字段:1,2 ,,,,,,,
从表
中选择max(id)+1完成查询后,您必须合并tms / id / month和...... ...
我添加了基本设计图片
答案 1 :(得分:0)
在DB外部生成唯一ID是个坏主意。在您的情况下,您可以轻松获得两个或更多请求尝试插入相同的ID。我建议你像往常一样在DB中使用主键。获取TMS / IT / ..的任务将通过将ID列与其他列或常量值合并来确定。
答案 2 :(得分:0)
您的查询无法按照书面形式运作。
SELECT max(id_request) as max_id
FROM tbl_request
WHERE id_request LIKE '%TMS/IT/MONTH(NOW())/%'
LIKE
子句'%TMS/IT/MONTH(NOW())/%'
的模式是一个字符文字。它不会被评估。即使你连接,MONTH(NOW())
是一个普通的整数,而不是填充字符。您还需要使用LPAD()
。
试试这个:
SELECT max(id_request) as max_id
FROM tbl_request
WHERE id_request LIKE CONCAT('%TMS/IT/',LPAD(MONTH(NOW()),3,'0'),'/%')
但是,我不知道这是否有效。您可能需要使用PHP中的参数化查询,该查询正确填充字符串中的月份。
此外,这正是为什么违反第一范式是一个非常糟糕的主意。创建四个字段并定义复合主键。
答案 3 :(得分:0)
那是因为你的$ id-> max返回NULL并且使用++运算符它变为1,这已经存在于你的数据库中,所以要解决这个问题,你需要修复你的选择最大查询:
SELECT max(id_request) as max_id
FROM tbl_request
WHERE id_request LIKE CONCAT('TMS/IT/',MONTH(NOW()),'/%')