2013-05-07 64 views
1

我一直在對這個小查詢進行相當多的研究,並且決定是時候提出問題了。這可能是一個很長的帖子,所以我爲此道歉。SQL顯示最近來自連接表的更新

這是學校裏的功課,而我只是用一些SQL玩耍,我使用MySQL作爲數據庫管理系統。

我想顯示所有成員的信息,使用連接在SQL語句。

這裏的表的簡要概述,我有

成員

  • ID
  • Firs_Name
  • 姓氏
  • USER_ID(外鍵用戶表)
  • 會員_類型(外鍵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 [email protected]   38 jlennon  Full Standard Member   185 C Grade 
2 Devin  Townsend 9342 3421 [email protected]  78 dtownsend Senior 70+     135 B Grade 
3 Mikael  Akerfeldt 9342 5675 [email protected]  41 makerfeldt Full Standard Member   185 F Troop 
4 Dexter  Morgan  8324 3211 [email protected]   67 dmorgan  Social      35 B Grade 
5 Martin  Mendez  7845 3454 [email protected]   82 mmendez  Senior 70+     135 A Grade 
6 Paul  McCartney 7543 8765 [email protected]  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 

現在上面的日期是每個成員的最近日期,但是等級不正確,例如,Member_ID:1現在在Grade_ID中:6自「2013-05-06」起不是Grade_ID:3

也許我應該嘗試使用等級表作爲選擇語句FROM子句中的起點。如果我這樣做了,我是否仍然可以通過成員表中的外鍵輕鬆獲取成員用戶名和成員信息?

對不起,這是一篇很長的文章,我真的不知道如何把所有這些都放在一邊,而且我喜歡在描述我已經試過的所有東西時徹底。

+0

雖然MySQL的實現GROUP BY擴展(見http://dev.mysql.com/doc/refman/5.6/en/group-by-extensions.html)它不提供任何保證,非聚集GROUP BY列表之外的字段將具有*合理的*值。 – 2013-05-07 02:42:08

+0

謝謝,我想我明白你在說什麼,我將來會記住這一點。 – 2013-05-07 04:15:06

回答

0

您可以在grades上查詢以查找成員最近成績的日期(假設成員在給定日期只有1個成績)。然後將其加回到grades表中,以篩選出每個成員的最大日期等級。然後使用此結果加入其他表(grade_typemember)。如果成員有可能沒有成績,並且您希望他們無論如何都顯示在列表中(沒有成績),那麼您需要通過成員和外部聯接將查詢驅動到子查詢結果。

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 
+0

感謝你的支持,它的工作原理非常漂亮,我能夠輕鬆地添加額外的表單成員信息,以及一些鏈接到成員表的其他表。 但是,我不得不改變它的一小部分...... ON(g.member_id = m.member_id AND g.dte = m.dte)......必須讓它......和g.' DATE' = m.dte ...無論如何,這個工作,非常感謝。 – 2013-05-07 04:12:01