MySQL-查询未列出所使用三个表格之一的所有记录



我有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耐心等待;实际上,即使看起来不像它也很有意义。

最新更新