0

tbl_students と tbl_inv の 2 つのテーブルがあります。Student テーブルには、学生に関するすべての情報が保持されます。学生の請求書 (毎月) の記録を作成して保持するための請求書発行システムを作成しています。tbl_inv には、1 人の学生に対して日付が異なる複数の請求書を含めることができます。最新の請求書、合計、ステータスを最新の請求書の日付順に並べたすべての学生を一覧表示する配列を作成しようとしています。私は mysql と php を使ったプログラミングにかなり慣れていないので、私の質問がばかげているように聞こえたら申し訳ありません。これは私がクエリのために持っているものです.....

$query = "SELECT * FROM tbl_student 
  LEFT JOIN tbl_inv ON tbl_student.sid = tbl_inv.inv_sid 
  GROUP BY tbl_student.sid 
  ORDER BY tbl_inv.inv_date DESC";

これにより、生徒ごとに 1 行の配列が作成されますが、最新の請求書の日付と詳細は表示されません。

誰かが助けてくれれば、私は大歓迎です:-)

(直接のコメントから既存の回答へのプルの追加)

これが機能する最後のクエリです。

SELECT 
      S.*, 
      TI2.* 
   FROM 
      tbl_student S 
         LEFT JOIN ( SELECT 
                           TI.inv_sid, 
                           MAX(TI.inv_id) LatestInvoice 
                        FROM 
                           tbl_inv TI 
                        GROUP BY 
                           TI.inv_sid ) PreQuery 
            ON S.sid = PreQuery.inv_sid 
            LEFT JOIN tbl_inv TI2 
               ON PreQuery.inv_sid = TI2.inv_sid 
              AND PreQuery.LatestInvoice = TI2.inv_id 
   ORDER BY 
      TI2.inv_id ASC

学生テーブルの f_link というフィールドを使用して、学生同士をリンクさせます。生徒に家族がリンクされている場合、f_link フィールドにはマスター ID 番号が表示されます。家族のリンクがない場合、フィールドには 0 が表示されます。私の請求システムでは、学生とその家族にリンクされている家族の請求書を作成しています。現在のクエリでは、家族の請求書のデータは表示されませんが、請求されています。このクエリを絞り込んで、f_link フィールドが 0 の学生のみを表示したいと考えています。

4

1 に答える 1

1

クエリを探して学び続けてください...フォーマットと読みやすさは、将来のメンテナンスにとって大きなプラスです。このタイプの問題については、最初に必要なものは何かを尋ねてください...あなたの場合、学生ごとに、彼らが持っていた最後の請求書は何ですか(データに関係なく)。

select
      TI.inv_sid,
      MAX( TI.inv_date ) LatestInvoiceDate
   from
      tbl_inv TI
   group by
      TI.inv_sid

上記はあなたにパズルの一部を与えるでしょう、そしてそれはいくつの複雑なクエリが構築されるかです。これから、学生の名前と、この最新の請求書に関する請求書の詳細が必要になります。これを行うには、上記のクエリを次のフェーズで使用します...この場合、結果セットの「エイリアス」を取得して、残りの詳細を取得します。

select
      S.*,
      TI2.*
   from
      tbl_Student S
         LEFT JOIN  ( select
                            TI.inv_sid,
                            MAX( TI.invoicenumber ) LatestInvoiceNumber,
                            count(*) totalInvoicesForStudent,
                            sum( TI.Total ) as TotalAllInvoices,
                            sum( TI.Total - TI.AmountPaid) as OutstandingBalances
                         from
                            tbl_inv TI
                         group by
                            TI.inv_sid ) PreQuery
            on S.sid = PreQuery.inv_sid
            LEFT JOIN tbl_inv TI2
               on PreQuery.inv_sid = TI2.inv_sid
              AND PreQuery.LatestInvoiceNumber = TI2.invoiceNumber
   where
      s.F_Link = 0
   order by
      TI2.inv_date desc

したがって、上記のクエリを明確にするために

すべての学生(最初にリストされている表)の場合、

すべての学生が最新の請求日を持っている「PreQuery」結果セットにLEFTJOIN(まだ請求書を持っているかどうかに関係なくすべての学生)を実行します。

そのような請求書レコードが見つかった場合は、請求書テーブルに対して別のLEFT JOINを再度実行しますが、今回は、元の請求書テーブルに対してそのユーザーに対して決定されたPreQueryの「学生ID」と「LatestInvoiceDate」を使用します。

これらがすべて結合されたら、請求書の詳細について、学生テーブルとSECONDインスタンス(TI2)請求書テーブルの両方からすべてのフィールドを取得します。

ここで、請求書が1つ以上ある学生のみが必要な場合は、「LEFTJOIN」ではなく「JOIN」のままにします。

于 2012-11-28T01:56:18.977 に答える