0

現在、請求書を個別のプロジェクトに割り当てることができる請求書発行システムを設計しています。請求書は 1 つのプロジェクトにのみ割り当てられます。

現在、請求書番号を使用してクエリを実行したい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カウントを実行してから、現在までの合計数を列に追加できますが、何か新しいことを学び、テーブルを最小限に抑えたい.

解決策やヘルプをお寄せいただきありがとうございます。

アラン

編集

OK いくつかの追加情報。

  • データを取得しているテーブルの名前は urn です。
  • 現在、私のテーブルには、URN_ID、URN_PROJECT_ID、URN_Date、URN_Due_Terms、URN_Doc_Type という 5 つの列があります。

注意: 上記の列データを更新して、実際の列名を反映させました

これまでのところ、私は試しました:

$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 に答える