我有两张桌子,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的学生。
答案 0 :(得分: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”结果集进行LEFT JOIN(所有学生,无论是否有发票)。
如果发现了这样的发票记录,请对发票表AGAIN进行另一次LEFT JOIN,但这次是在为该用户确定的PreQuery“student id”和“LatestInvoiceDate”到原始发票表中。
将所有这些字段连接在一起后,从学生表和SECOND实例(TI2)发票表中获取所有字段,以获取发票明细。
现在,如果您只想要拥有至少1张发票的学生,只需留下“加入”而不是“左加入”。