从联接表中获取最大日期

时间:2015-03-07 23:37:52

标签: mysql join left-join

我的第一张桌子是会员桌:

member_id,  name,   address,    email
1           jon     122 any     jon@test.ca
2           amy     111 gee     amy@test.ca

我的第二张表是完成的测试级别:

MemberHistoryTable
member_id,  level,  date
1           a       2007
1           b       2008
1           c       2009
1           d       2010
2           a       2007
2           b       2008
2           c       2009
2           d       2010
2           d       2011

我想在历史记录表中检索成员信息和最近的日期:

jon, 122 any, jon@test.ca, 2010
amy, 111 gee, amy@test.ca, 2011

我尝试了很多不同的方法来加入这两个表,例如:

SELECT
  memberTable.name,
  memberTable.address,
  memberTable.email,
  memberHistoryTable.date
FROM memberTable

LEFT JOIN memberHistoryTable
  ON memberHistoryTable.member_id=memberTable.member_id

但是这会再现多行相同的信息,每个日期都有一行......

jon, 122 any, jon@test.ca, 2007
jon, 122 any, jon@test.ca, 2008
jon, 122 any, jon@test.ca, 2009
jon, 122 any, jon@test.ca, 2010
amy, 111 gee, amy@test.ca, 2007  
amy, 111 gee, amy@test.ca, 2008
amy, 111 gee, amy@test.ca, 2009
amy, 111 gee, amy@test.ca, 2010
amy, 111 gee, amy@test.ca, 2011

如果我将联接更改为:

LEFT JOIN (SELECT MAX(memberHistoryTable.date) FROM memberHistoryTable) X
  ON x.member_id = memberTable.member_id

我得到了我想要的行,但是日期是NULL ......

    jon, 122 any, jon@test.ca, NULL
    amy, 111 gee, amy@test.ca, NULL

我尝试了很多种类的连接,但似乎都没有。无效值或系统只是挂起。

我花了很多时间搜索,我找到了许多似乎对我不起作用的解决方案。奇怪的是,我需要从另一个表中提取该查询的日期,但那个似乎有效。

1 个答案:

答案 0 :(得分:0)

您可以使用MAX()GROUP BY来获得所需的结果:

SELECT m.name, m.address, m.email, MAX(mh.date) `date` FROM memberTable m
INNER JOIN memberHistoryTable mh ON mh.member_id = m.member_id 
GROUP BY m.name;

我假设member_id表格中amy的{​​{1}}应为members而不是2,因为它似乎1 1}}是标识表中每个成员的唯一值。

以上查询会产生如下内容:

member_id

我还想指出+------+---------+-------------+--------------+ | name | address | email | date | +------+---------+-------------+--------------+ | amy | 111 gee | amy@test.ca | 2011 | | jon | 122 any | jon@test.ca | 2010 | +------+---------+-------------+--------------+ 是mysql中的关键字,即使它可以用作不带引号的标识符,我也会考虑将我的列命名为其他内容。

我还建议您按date而不是member_id进行分组,因为根据我的理解,名称并不是唯一的:

name