0

我目前正在设计一个发票系统,可以将发票分配给单独的项目。发票只会分配给一个项目。

目前我有一个 mysql 表,我想用发票号查询,检索发票所针对的各个项目的所有发票,按创建日期订购它们,然后(这是我坚持的一点)基于我将查询的发票编号,计算该发票在该项目总发票中的数量。

为了增加一些清晰度,我的意思是以下

URN_ID        URN_Project_ID    URN_Date
1             1                 2012-03-17
2             3                 2012-03-18
3             2                 2012-03-21
4             1                 2012-03-21
5             2                 2012-04-05
6             1                 2012-04-08
7             3                 2012-04-15
8             2                 2012-04-24
9             1                 2012-05-02
10            3                 2012-05-10

假设我查询了 6 号发票,因此项目是项目 1。本质上,我会将信息范围缩小到以下内容

URN_ID        URN_Project_ID    URN_Date
1             1                 2012-03-17
4             1                 2012-03-21
6             1                 2012-04-08
9             1                 2012-05-02

从上面我们可以看到,我总共有 4 张发票,但是我想要一种方法来返回发票 6 是 4 张发票中的第 3 号。这样做的目的是,如果将来有人打印发票副本,查看它的人可以清楚地看到该项目的发票 3。最后,我不需要详细说明我的文档上的发票总数,只需要总数中的位置即可。

对此的任何帮助将不胜感激,因为我大部分时间都在寻找我可以拼凑但无济于事的解决方案。作为后备,我总是可以在我的表中添加另一列,并在输入阶段进行 mysql 计数,然后将迄今为止的总数添加到列中,但我宁愿学习新的东西并将我的表保持在最低限度。

提前感谢任何解决方案或帮助。

艾伦

编辑

确定一些附加信息。

  • 我从中提取数据的表称为:urn
  • 目前我的表有 5 列,分别称为 URN_ID、URN_PROJECT_ID、URN_Date、URN_Due_Terms、URN_Doc_Type

注意我已经更新了上面的列数据以反映我的实际列名称

到目前为止,我已经尝试过:

$query2 = "SELECT  @curRow := @curRow + 1 AS row_number, iv.* FROM urn iv JOIN (SELECT @curRow := 0) r WHERE iv.URN_Project_ID='$urn_project_id'";
$res2 = mysql_query($query2);
$data2 = mysql_fetch_array($res2);
echo $data2['row_number'];

但是,无论我显示了哪个 URN_ID,这只会返回 1 作为值。

我对使用 @ 符号的语句一无所知,因此不知如何调试它。

任何帮助都会很好。

干杯。铝。

4

2 回答 2

2

您基本上想在结果集中添加一个行号,例如:

SELECT  @curRow := @curRow + 1 AS row_number,
        iv.*
FROM    invoices iv
JOIN    (SELECT @curRow := 0) r
WHERE   iv.project_id=1;

这应该返回:

row_number invoice id    project_id    invoice_date
1          1             1             2012-03-17
2          4             1             2012-03-21
3          6             1             2012-04-08
4          9             1             2012-05-02
于 2012-06-02T13:42:25.807 回答
0

虽然一开始可能看起来有点不舒服,但这可能是最好的方法。

mysql> SET @rank=0;

mysql> SELECT @rank:=@rank+1 AS rank,OtherColumns as Column FROM Invoices .....

@rank 增量将做你想做的事。您应该事先设置@rank 变量;如果排名设置或不喜欢(未测试),可能有一种方法可以做一个案例然后结束:

mysql> SELECT case @rank when NULL then @rank=0 else @rank:=@rank+1 end as rank FROM ....
于 2012-06-02T13:39:28.083 回答