在加入中获取 table 的最大日期

Get max date from table in join

我的第一个table是会员table:

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

我的第二个 table 是完成的测试级别:

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

我想检索历史上的会员信息和最近的日期table:

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

我尝试了很多不同的方法来连接两个 table,例如:

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

我尝试了多种连接变体,none 似乎有效。空值或系统挂起。

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

您可以使用 MAX() and a 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;

我假设 members table 中 amymember_id 应该是 2 而不是 1,因为它似乎 member_id 是一个唯一值,用于标识 table.

中的每个成员

上面的查询会产生如下结果:

+------+---------+-------------+--------------+
| name | address | email       | date         |
+------+---------+-------------+--------------+
| amy  | 111 gee | amy@test.ca | 2011         |
| jon  | 122 any | jon@test.ca | 2010         |
+------+---------+-------------+--------------+

我还想指出 date 是 mysql 中的关键字,即使它可以用作不带引号的标识符,我也会考虑将我的专栏命名为其他名称。

我还建议您按 member_id 而不是 name 分组,因为据我所知,名称不能保证是唯一的:

SELECT m.member_id, 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.member_id;