从日期=本月的数据库中获取Max rownumber +1

时间:2014-01-21 16:03:57

标签: php mysql sql

我正在设计一种为票务系统提供自动递增值的方法。它是一种现有格式,我正在尝试镜像原始系统,以保持使用当前系统的员工满意。以下是其唯一标识符的示例:

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语句中执行它,分配较低和较高的值以便在两者之间执行日期,但我宁愿由系统自动完成。有没有办法可以做到这一点,因为我简直无知,我对这一切都感到困惑。任何帮助将不胜感激。

干杯,丹

3 个答案:

答案 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,这就是你的样子在您的交换机中“手动”进行操作)。门票数量就是该年份和月份的门票号码。