SQL显示来自连接表的最新更新

SQL显示来自连接表的最新更新,sql,join,Sql,Join,我已经对这个小问题做了很多研究,并决定是时候问这个问题了。这可能是一个很长的帖子,所以我为此道歉 这是一个学校作业,我只是在玩一些SQL,我使用mySQL作为DBMS 我试图在SQL语句中使用连接来显示所有成员的信息 以下是我所拥有的表格的简要概述 成员 身份证 冷杉名 姓 用户ID(用户表的外键) 成员资格类型(成员资格类型表的外键) 电话 电子邮件 年龄 等级类型 身份证 描述 Grade_type表中的数据如下所示 ID DESCRIPTION 等级(这是一个连接表,其中

我已经对这个小问题做了很多研究,并决定是时候问这个问题了。这可能是一个很长的帖子,所以我为此道歉

这是一个学校作业,我只是在玩一些SQL,我使用mySQL作为DBMS

我试图在SQL语句中使用连接来显示所有成员的信息

以下是我所拥有的表格的简要概述

成员

  • 身份证
  • 冷杉名
  • 用户ID(用户表的外键)
  • 成员资格类型(成员资格类型表的外键)
  • 电话
  • 电子邮件
  • 年龄
等级类型

  • 身份证
  • 描述
Grade_type表中的数据如下所示

ID  DESCRIPTION  

等级(这是一个连接表,其中包含成员ID、等级和日期,以保存等级升级和降级的历史记录

  • 身份证
  • 成员ID(FK到成员表
  • 等级ID(FK到等级类型表
  • 日期
此表中的数据如下所示,如您所见,多个成员已更改了2-3次等级

ID  MEMBER_ID  GRADE_ID  DATE        

我想做的是有一个这样的输出,最后的等级显示了最近的变化,下面也是我用来接收这个的SQL状态,我正在努力找出在哪里,或者如何输入“MAX(
DATE
)字段或类似的内容

ID  FIRST_NAME  LAST_NAME  PHONE      EMAIL                    AGE  USERNAME    Membership Type       ANNUAL_FEE  Grade    
 1  John        Lennon     9345 3253  jlennon@gmail.com         38  jlennon     Full Standard Member         185  C Grade  
 2  Devin       Townsend   9342 3421  dtownsend@gmail.com       78  dtownsend   Senior 70+                   135  B Grade  
 3  Mikael      Akerfeldt  9342 5675  makerfeldt@gmail.com      41  makerfeldt  Full Standard Member         185  F Troop  
 4  Dexter      Morgan     8324 3211  dmorgan@gmail.com         67  dmorgan     Social                        35  B Grade  
 5  Martin      Mendez     7845 3454  mmendez@gmail.com         82  mmendez     Senior 70+                   135  A Grade  
 6  Paul        McCartney  7543 8765  pmccartney@gmail.com      36  pmcartney   Social                        35  E Grade
SQL语句

SELECT `members`.`ID`, `members`.`FIRST_NAME`, `members`.`LAST_NAME`,`members`.`PHONE`,`members`.`EMAIL`,`members`.`AGE`, 
`users`.`USERNAME`, `membership_type`.`DESCRIPTION` AS 'Membership Type',`membership_type`.`ANNUAL_FEE`, `grade_type`.`DESCRIPTION` AS 'Grade' FROM `2013evccor`.`members`
JOIN `users` ON `members`.`USER_ID` = `users`.`ID`
JOIN `membership_type` ON `members`.`MEMBERSHIP_TYPE` = `membership_type`.`ID`
LEFT JOIN (`grades` JOIN `grade_type` ON `grade_type`.`ID` = `grades`.`GRADE_ID`) ON `grades`.`MEMBER_ID` = `members`.`ID` GROUP BY `members`.`ID`
我尝试过的另一个语句是现在的这个,以及连接中的嵌套语句

SELECT `grades`.`MEMBER_ID`,`grades`.`GRADE_ID`,MAX(`grades`.`DATE`) AS 'DATE' FROM `grades` GROUP BY `grades`.`MEMBER_ID`
但是,这会返回以下数据:

MEMBER_ID  GRADE_ID  DATE        
---------  --------  ------------
        1         3  2013-05-06  
        2         2  2013-04-10  
        3         6  2013-03-13  
        4         2  2013-04-09  
        5         1  2012-12-13  
        6         5  2013-04-09
现在,上面的日期是每个成员的最新日期,但是等级不正确,例如,从'2013-05-06'起,成员ID:1现在是等级ID:6,而不是等级ID:3

也许我应该尝试在select语句
FROM
子句中使用grades表作为原点。如果这样做,我是否仍然能够通过members表中的外键轻松获取成员用户名和成员信息


很抱歉,这是一篇很长的帖子,我真的不知道该怎么写,我想详细地描述我已经尝试过的所有内容。

你可以从查询
等级开始,查找成员的最新等级日期(假设一个成员在给定日期只有一个等级)。然后将其连接回
等级
表,以筛选出每个成员的此最长日期的等级。然后使用此结果连接到其他表(
等级类型
成员
)。如果成员可能没有等级,但您仍希望它们显示在列表中(没有等级),则需要按成员驱动查询,并将外部联接到子查询结果

SELECT g.member_id, t.description
  FROM grades g
  INNER JOIN ( SELECT member_id, max(dte) as dte
         FROM grades
         GROUP BY member_id
          ) m
    ON (g.member_id = m.member_id AND g.dte = m.dte)
  INNER JOIN grade_type t ON (g.grade_id = t.id)
  ORDER BY g.member_id

而MySql实现了分组扩展(请参阅)它不能保证GROUP BY list之外的非聚合字段具有合理的值。谢谢,我想我理解你的意思,我以后会记住这一点。谢谢,它工作得很好,我能够轻松地添加额外的信息表单成员,以及链接到members表。我必须更改一小部分,但是,它不像…ON(g.member\u id=m.member\u id和g.dte=m.dte)…必须更改它…并且g.
DATE
=m.dte…无论如何,这很有效,非常感谢。
MEMBER_ID  GRADE_ID  DATE        
---------  --------  ------------
        1         3  2013-05-06  
        2         2  2013-04-10  
        3         6  2013-03-13  
        4         2  2013-04-09  
        5         1  2012-12-13  
        6         5  2013-04-09
SELECT g.member_id, t.description
  FROM grades g
  INNER JOIN ( SELECT member_id, max(dte) as dte
         FROM grades
         GROUP BY member_id
          ) m
    ON (g.member_id = m.member_id AND g.dte = m.dte)
  INNER JOIN grade_type t ON (g.grade_id = t.id)
  ORDER BY g.member_id