2012-06-02 32 views
0

我目前正在設計一個發票系統,其中發票可以分配給單獨的項目。發票只能分配給一個項目。在mysql查詢中計算訂單位置

目前我有一個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計數,然後將總數添加到列中,但我寧願學習新的東西並將表格保持在最小值。

在此先感謝您提供任何解決方案或幫助。

艾倫

編輯

確定一些額外的信息。

  • 我的表,我從被稱爲拉動數據:甕
  • 目前我的表有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']; 

但是,這僅無論返回值1,其中URN_ID我已經顯示出來。

我沒有使用@ sign的語句的真正知識,因此我不知道如何調試它。

任何幫助都會很好。

乾杯。 Al。

+0

向我們展示您的查詢!發票的編號取決於您在哪個欄目中訂購結果... – Kjir

+0

難道你不能在申請表中追加職位嗎?在輸出步驟中做到這一點更容易和更簡潔 – zerkms

回答

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 
+0

當我調整代碼以適合我的實際表頭時,您對如何顯示行號有任何建議嗎? – Burdie87

+0

雖然我發佈瞭如何做你說的你想要的內容,但接下來的問題是你在使用什麼(計算機)語言編寫你的發票系統,以及你如何使用這個結果?順便說一句,我忘了添加一個ORDER BY iv.invoice_date asc;在查詢的結尾處 - 對不起! – vogomatix

+0

對不起,我的第一篇文章可能沒有足夠的細節。我使用PHP和我只需要輸出行號作爲變量的回聲,所以很簡單的東西只是從你的例子中得到它。 – Burdie87

0

雖然起初看起來有點不舒服,但這可能是最好的方法。

mysql> SET @rank=0; 

mysql> SELECT @rank:[email protected]+1 AS rank,OtherColumns as Column FROM Invoices ..... 

@rank增量將做你想做的。你應該事先設置@rank變量;可能有辦法做到的情況下,那麼如果級別設定結束或不喜歡(未測試):

mysql> SELECT case @rank when NULL then @rank=0 else @rank:[email protected]+1 end as rank FROM ....