MYSQL - 查询未列出正在使用的三个表之一的所有记录

时间:2014-02-03 19:21:55

标签: mysql

我有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中选择最新的支付记录,即当前状态。

谢谢。

1 个答案:

答案 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的东西;它实际上确实有意义,即使它看起来不像。