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