加入mysql表时获得最大值的最佳方法

时间:2014-10-07 10:35:46

标签: mysql join max innodb

我有三个MYSQL表(innoDB):

NAMES

id nid version fname lname birth

RELATIONS

id rid version idname idperson roleid

ROLES

id role

我想为特定的idperson(以及ROLE的名称)选择加入其相关NAMES的最新版本的每个RELATIONS的最新版本

当然,idperson将有0个,1个或更多个关系,并且会有一个或多个版本的RELATIONS和NAMES

我写了类似的东西:

SELECT A.id,A.nid,MAX(A.version),A.idname,A.idperson,A.roleid,B.id,B.role
FROM RELATIONS A 
INNER JOIN 
ROLES
ON A.roleid = B.id
INNER JOIN
(SELECT id,nid,MAX(version),fname,lname,birth FROM NAMES) C
ON A.idname = C.id
WHERE A.idperson = xx

它可能不起作用,因为MAX()似乎只返回一行...... 如何在此连接上下文中获取多行的最大值?

PS:你如何生成这种不错的数据集?

即。 :

id  home  datetime     player   resource 
---|-----|------------|--------|---------
1  | 10  | 04/03/2009 | john   | 399
2  | 11  | 04/03/2009 | juliet | 244
5  | 12  | 04/03/2009 | borat  | 555
8  | 13  | 01/01/2009 | borat  | 700

1 个答案:

答案 0 :(得分:0)

在子查询中以及在外部查询中添加GROUP BY语句都应该允许MAX函数生成您正在查找的结果。

这是未经测试的代码,但应该为您提供您正在寻找的结果:

SELECT A.id,A.nid,MAX(A.version),A.idname,A.idperson,A.roleid,B.id,B.role
FROM RELATIONS A 
INNER JOIN 
ROLES
ON A.roleid = B.id
INNER JOIN
(SELECT id,nid,MAX(version),fname,lname,birth FROM NAMES GROUP BY fname,lname) C
ON A.idname = C.id
WHERE A.idperson = xx
GROUP BY fname,lname

或者,如果它对您的数据库体系结构更有效,那么您可以为您想要的员工使用任何唯一标识符(可能是nid?)。

关于你在PS中提出的问题,我不确定你在问什么。我在您提供的表格示例中似乎不是homedatetimeplayerresource字段。如果你能澄清一下,我也很乐意尝试帮助你。