我正在设计一种为票务系统提供自动递增值的方法。它是一种现有格式,我正在尝试镜像原始系统,以保持使用当前系统的员工满意。以下是其唯一标识符的示例:
ID No: 13L041
在这种情况下,13
代表年份(2013)L
代表月份(12月),041
代表该月份的门票号码。我在这里得到了一些代码,用于获得短年并在此处分配月份代码:
<?php
$trackingID ='';
$year = date("y");
$trackingID.= $year;
$month = date("n");
switch($month){
case 1:
$monthCode ="A";
break;
case 2:
$monthCode ="B";
break;
case 3:
$monthCode ="C";
break;
case 4:
$monthCode ="D";
break;
case 5:
$monthCode ="E";
break;
case 6:
$monthCode ="F";
break;
case 7:
$monthCode ="G";
break;
case 8:
$monthCode ="H";
break;
case 9:
$monthCode ="I";
break;
case 10:
$monthCode ="J";
break;
case 11:
$monthCode ="K";
break;
case 12:
$monthCode ="L";
break;
}
$trackingID.= $monthCode;
$trackingID.= 1;
echo $trackingID;
?>
这段代码效果很好,但我现在遇到如何从数据库中获取递增数字的问题。让我们假设本月系统中有70张票。从进入新机票时起,我们预计机票号为14A71。我有代码来查询SQL以查找行号:
SELECT trackid, @rowNum := @rowNum + 1 AS row_number FROM customerservice.tbl_tickets JOIN (SELECT @rowNum := 0) r;
最终用户希望每月重置增量号码。因此,1月将从001开始,结束于131,例如,2月将从001开始,依此类推。
我只是遇到问题如何获得当前年/月发布的记录。我可以在switch语句中执行它,分配较低和较高的值以便在两者之间执行日期,但我宁愿由系统自动完成。有没有办法可以做到这一点,因为我简直无知,我对这一切都感到困惑。任何帮助将不胜感激。
干杯,丹
答案 0 :(得分:0)
由于听起来你有记录插入的日期时间值,我强烈建议使用它。在这里,您可以获得当月的最新票证
SELECT trackid
FROM tbl_tickets
WHERE insert_date_field >= MONTH(CONCAT_WS('-',YEAR(NOW()),MONTH(NOW()),'01 00:00:00')
ORDER BY insert_date_field DESC
LIMIT 1
如果需要,您可以轻松使用字符串操作直接在查询中获取最后一部分。如果结果集中的行数为0,那么这将是该月的第一个记录。
当然,您可能需要查看读取此记录,然后在事务中添加带有递增计数器的新记录,并使用适当的表锁定,以便最终不会出现重复值。
答案 1 :(得分:0)
如果您没有date_time字段,可以尝试这样的
Select count(*)+1 From customerservice.tbl_tickets Where trackid Like '$year$monthCode%';
我们获取以year和monthCode组合开头的那些。
确保$ year和$ monthCode来自您的PHP代码。
希望有所帮助。
答案 2 :(得分:0)
因为我们对您的数据库架构知之甚少,所以很难建议完整的证明解决方案,但请耐心等待。
我会尝试尽可能规范化数据库中的数据,并且只修改获取的数据,以便最终用户满意(但永远不要在数据库中更改它)。让我们说这或多或少是建议的结构:
CREATE TABLE some_table (
date_tracker TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
ticket_count INT UNSIGNED NOT NULL,
INDEX date_tracker (date_tracker)
)
date_tracker字段将记录执行插入的时间(从您的评论中我推断出您已经有这样的字段,因此请使用它)。 ticket_count字段将记录该月的门票数量(我们将“手动”增加)。我在date_tracker列上添加了一个索引,但取决于您可能没有必要的记录数。
示例插入语句如下所示:
INSERT INTO some_table
(
ticket_count
)
SELECT
COUNT(*) + 1
FROM
some_table
WHERE
DATE_FORMAT(date_tracker, '%Y-%c') = DATE_FORMAT(CURDATE(), '%Y-%c')
当然,您很可能会插入更多信息,但这主要是为了让您走上正轨。如您所见,我将给定年份和月份的ticket_count存储在INT列中,然后通过选择前一个计数+ 1来增加它。
现在出现了有趣的partL - select语句:
SELECT
CONCAT(
DATE_FORMAT(date_tracker, '%y'),
CHAR(DATE_FORMAT(date_tracker, '%c') + 64),
ticket_count
) AS ticketid
FROM
some_table
LIMIT 0, 30
CONCAT()函数使用空字符串简单地连接所有参数。对DATE_FORMAT函数的调用返回年份的2位数表示(2014年为14,1993年为93等)。 CHAR函数使用ASCII字符映射返回结果字符,注意我如何取月份数并添加64(因此,1月它将是CHAR(1 + 64)= CHAR(65)= A,这就是你的样子在您的交换机中“手动”进行操作)。门票数量就是该年份和月份的门票号码。