我有3个表。tbl_c =成员的第一个和姓氏列表tbl_b =每个成员提供的组类列表tbl_c =成员资格付款和当前成员资格状态的列表。我需要输出成员(tbl_a)的第一个和姓氏及其基于groupTheme选择(tbl_a)提供的所有组。除列表外,如果其状态为"当前"(tbl_b)。
我已经尝试了以下内容,但它仅在该特定组中打印出第一个记录。例如,如果有人在不同的日子(TBL_A)教了2个小组,我想看这两个。
SELECT a.mID, a.ageGroup, a.groupTheme, firstName, lastName, a.dayAvail, a.startTime, a.endTime, b.memberType, MAX( b.paymentDate ) , b.id
FROM referrals a
LEFT JOIN members c ON a.mID = c.id
INNER JOIN membership b ON a.mID = b.memberID
WHERE a.ageGroup ='preSchool'
GROUP BY a.mID
ORDER BY lastName
我相信Groupby函数不允许通过超过一个记录到输出,而仅选择最新的付款记录,因此当前状态,从TBL_B。
谢谢。
从您的问题中看来,您正在尝试使用MAX(b.paymentDate)
提取成员的最新付款日期。您的GROUP BY
擦干重复项非常正确。但是您的问题不能非常清楚地解释这一特定要求,所以我要猜测。
如果您使用此查询而不是您给出的查询会发生什么?
SELECT a.mID, a.ageGroup, a.groupTheme,
c.firstName, c.lastName,
a.dayAvail, a.startTime, a.endTime
FROM referrals AS a
LEFT JOIN members AS c ON a.mID = c.id
WHERE a.ageGroup ='preSchool'
ORDER BY lastName, a.groupTheme
您是否在结果集中获得正确的行数?(显然,您不会从membership
表中获取列;我们没有将其包括在查询中)。
如果是这样,您就可以良好的开始。下一步是针对您的membership
表编写摘要查询(总查询)。此查询需要为每个成员返回一行。您没有告诉我们有关那张桌子的太多信息,所以我猜想,但这是一个可能的子查询。我想您在membership
中有一个成员所做的每一行。因此,我们需要去找到与最新付款相对应的行。
我们正在做的是为每个成员寻找membership
表中的最高id
号。我猜该表中的id
列是一个自动插件,这意味着最高的id
值是最新的条目。因此,这是一个查询,使我们对每个成员几乎没有事实。这个小查询给我们每个成员一排。
SELECT MAX(id) AS id, memberID
FROM membership
GROUP BY memberId
接下来,我们需要将该查询加入您的整体查询以获取最新信息。
看起来像这样:
SELECT a.mID, a.ageGroup, a.groupTheme,
c.firstName, c.lastName,
a.dayAvail, a.startTime, a.endTime
FROM referrals AS a
LEFT JOIN members AS c ON a.mID = c.id
INNER JOIN ( SELECT MAX(id) AS id,
memberID
FROM membership
GROUP BY memberId
) AS latestId ON a.mID = latestId.id
WHERE a.ageGroup ='preSchool'
ORDER BY lastName, a.groupTheme
您在这里看到技巧吗?这是有效使用SQL的关键。我们加入了一个子查询,好像是桌子一样。做到这一点的能力非常重要:这就是将结构化放在结构化查询语言中的原因。。
最后,我们需要从会员表中获取最焦点的行,并在选择子句中使用它。那需要另一个加入。
SELECT a.mID, a.ageGroup, a.groupTheme,
c.firstName, c.lastName,
a.dayAvail, a.startTime, a.endTime,
b.id, b.memberType, b.paymentDate
FROM referrals AS a
LEFT JOIN members AS c ON a.mID = c.id
INNER JOIN ( SELECT MAX(id) AS id,
memberID
FROM membership
GROUP BY memberId
) AS latestId ON a.mID = latestId.memberID
INNER JOIN membership AS b ON latestId.id = b.id
WHERE a.ageGroup ='preSchool'
ORDER BY lastName, a.groupTheme
将GROUP BY
移动到子查询可以防止其在结果集中擦除实际需要的行。
对此SQL耐心等待;实际上,即使看起来不像它也很有意义。