我有3张桌子。 TBL_C =成员的名字和姓氏列表TBL_B =每个成员提供的组类列表TBL_C =会员付款列表和当前成员资格状态。我需要根据groupTheme选择(TBL_A)输出成员的名字和姓氏(TBL_A)以及他们提供的所有组。除了列表之外,如果名称状态为“当前”(TBL_B),我需要在名称前加上“*”。
我尝试过以下内容,但它只打印该特定群组主题的第一条记录。例如,如果某人在不同的日子(TBL_A)教了两组,我想看到两者。
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功能不允许输出多个记录,而IT仅从TBL_B中选择最新的支付记录,即当前状态。
谢谢。
答案 0 :(得分:0)
根据您的问题,您似乎试图使用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
。所以我们需要找到与最新付款相对应的行。
我们正在做的是在每个成员的id
表中查找最高membership
个数字。我猜测该表中的id
列是AUTO_INCREMENT列,这意味着最高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子句中使用它。这需要另一个JOIN。
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的东西;它实际上确实有意义,即使它看起来不像。