在mysql查询中计算订单位置

时间:2012-06-02 13:20:40

标签: php mysql count

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

目前我有一个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是3号发票4号。这样做的目的是,如果有人在将来打印复印发票,那么查看它的人就很清楚该项目的发票3。最后,我不需要详细说明我的文档中的发票总数,只需要总数中的位置。

任何有关这方面的帮助都会非常感激,因为我早上大部分时间都在寻找解决方案,我可以拼凑起来但没有用。作为后备,我总是可以在我的表中添加另一列,并在输入阶段执行一个mysql计数,然后将总数添加到列中,但我宁愿学习新的东西并将我的表保持在最低限度。< / p>

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

艾伦

修改

确定一些其他信息。

  • 我从中提取数据的表格叫做:urn
  • 目前我的表有5列名为URN_ID,URN_PROJECT_ID,URN_Date,URN_Due_Terms,URN_Doc_Type

N.B。我已更新上面的列数据以反映我的实际列名称

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

$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作为值。

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

任何帮助都会很好。

干杯。 人

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 ....