我一直在对这个小查询进行大量研究,并决定是时候提出这个问题了。这可能是一个很长的帖子,所以我为此道歉。
这是一个学校作业,我只是在玩一些 SQL,我使用 mySQL 作为 DBMS。
我正在尝试在 SQL 语句中使用 JOIN 显示所有成员的信息。
这是我拥有的表格的简要概述
成员
- ID
- 名字
- 姓
- User_ID(用户表的外键)
- Membership_Type( Membership_type表的外键)
- 电话
- 电子邮件
- 年龄
Grade_Type
- ID
- 描述
Grade_type 表中的数据如下所示
ID DESCRIPTION
1 A Grade
2 B Grade
3 C Grade
4 D Grade
5 E Grade
6 F Troop
成绩(这是一个连接表,其中包含成员 ID、成绩和日期,以保存成绩提升和降级的历史记录。
- ID
- Member_ID(FK 到成员表
- Grade_ID(FK 到grad_type表
- 日期
这张表的数据如下,可以看到,多个会员换了2-3次等级
ID MEMBER_ID GRADE_ID DATE
1 1 3 2013-02-12
2 2 2 2013-03-14
3 4 2 2013-01-16
4 3 6 2013-01-29
5 5 1 2012-10-18
6 4 4 2013-04-09
7 6 5 2012-12-11
8 1 2 2013-05-03
9 2 3 2013-04-10
10 3 5 2013-03-13
11 4 3 2013-03-06
12 5 3 2012-12-13
13 6 4 2013-04-09
14 1 6 2013-05-06
我想要做的是有这样的输出,最后的等级,显示最近的变化,下面也是我用来接收这个的 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`
我尝试过的另一个语句是这个,就目前而言,以及 JOIN 中的嵌套语句
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
现在上面的日期是每个成员最近的日期,但是成绩不正确,例如,Member_ID: 1 现在是 Grade_ID: 6 as of '2013-05-06' 而不是 Grade_ID:3
也许我应该尝试在 select 语句子句中使用等级表作为起点。FROM
如果我这样做了,我是否仍然能够通过成员表中的外键轻松获取成员用户名和成员信息?
抱歉,这是一篇很长的帖子,我真的不知道该怎么写所有这些,我喜欢详尽地描述我已经尝试过的所有内容。