0

我有 2 张桌子,tbl_students 和 tbl_inv。学生表包含学生的所有信息。我正在创建一个发票系统来为学生创建和保存发票(每月)记录。tbl_inv 可以为单个学生提供多张发票,但日期不同。我正在尝试创建一个数组,该数组将列出所有学生的最新发票、总数和按顶部最新发票日期排序的状态。我对使用 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";

这将创建一个数组,每个学生一行,但不显示最新的发票日期和详细信息。

如果有人可以提供帮助,我将不胜感激:-)

(将直接评论添加到现有答案中)

这是有效的最终查询..

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

因此,为了澄清上述查询

对于每个学生(首先列出的表格),

对包含所有学生最近发票日期的“预查询”结果集进行 LEFT JOIN(所有学生,无论是否有发票)。

如果找到这样的发票记录,则再次向发票表执行 LEFT JOIN,但这次是在为该用户确定的预查询“学生 id”和原始发票表中的“LatestInvoiceDate”上。

将这些全部连接在一起后,从学生表和 SECOND 实例 (TI2) 发票表中获取所有字段以获取发票详细信息。

现在,如果您只需要至少有 1 张发票的学生,只需留下“JOIN”而不是“LEFT JOIN”。

于 2012-11-28T01:56:18.977 回答