Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用SQL GROUP BY时的合并_Mysql_Group By_Sql Merge - Fatal编程技术网

Mysql 使用SQL GROUP BY时的合并

Mysql 使用SQL GROUP BY时的合并,mysql,group-by,sql-merge,Mysql,Group By,Sql Merge,我在mySQL数据库中的数据看起来是这样的(但不仅仅是这4个,我有很多人出现了不止一次,但是有不同的资格和不同的修改日期) 选择将类似于: SELECT * FROM table where person_id=1 GROUP BY person_id 所以,如果我做了这个选择,并按person\u id分组,我会得到如下结果: 是否有可能按人员id分组,但要说:好的,给我最后修改的限定条件?通常我在where SQL语句中没有人员id。 因此,我希望从我的选择中选择所有人,但只需要最后修

我在mySQL数据库中的数据看起来是这样的(但不仅仅是这4个,我有很多人出现了不止一次,但是有不同的资格和不同的修改日期)

选择将类似于:

SELECT * FROM table where person_id=1 GROUP BY person_id
所以,如果我做了这个选择,并按person\u id分组,我会得到如下结果:

是否有可能按人员id分组,但要说:好的,给我最后修改的限定条件?通常我在where SQL语句中没有
人员id

因此,我希望从我的选择中选择所有人,但只需要最后修改资格的结果
(我希望我解释得很透彻,这样你就会明白问题所在)


(我的选择当然比我展示的要复杂得多,这只是为了向你展示我在做什么)

如果你想要某个特定人的最后修改条目,那就做吧

select * from table
where person_id = 1
order by modified desc
limit 1

如果您想要某个特定人员的最后一次修改条目,那么只需执行以下操作

select * from table
where person_id = 1
order by modified desc
limit 1
编辑

我误解了这个问题,我将更新答案

尝试此操作(假设您希望为每个人修改最后一次资格认证):


如果您想要所有人的上次修改资格:

SELECT
   qualification
FROM
   table
WHERE modified = (
       SELECT 
           MAX(modified)
       FROM
           table  
   )
编辑

我误解了这个问题,我将更新答案

尝试此操作(假设您希望为每个人修改最后一次资格认证):


如果您想要所有人的上次修改资格:

SELECT
   qualification
FROM
   table
WHERE modified = (
       SELECT 
           MAX(modified)
       FROM
           table  
   )

您还可以使用子查询返回每个
人员id
max
修改日期,然后将该结果连接到表中,以获得具有max日期的行:

select t1.id, 
  t1.person_id,
  t1.name,
  t1.qualification,
  t1.created,
  t1.modified,
  t1.version
from yourtable t1
inner join
(
  select person_id, max(modified) MaxMod
  from yourtable
  group by person_id
) t2
  on t1.person_id = t2.person_d
  and t1.modified = t2.maxmod

您还可以使用子查询返回每个
人员id
max
修改日期,然后将该结果连接到表中,以获得具有max日期的行:

select t1.id, 
  t1.person_id,
  t1.name,
  t1.qualification,
  t1.created,
  t1.modified,
  t1.version
from yourtable t1
inner join
(
  select person_id, max(modified) MaxMod
  from yourtable
  group by person_id
) t2
  on t1.person_id = t2.person_d
  and t1.modified = t2.maxmod

这听起来更像是我想要的,我会尝试一下,谢谢!看起来不错,但是性能太差了,我会做一个简单的SQL调用,然后用java进行优化。不过还是要谢谢你@bluefeet@Joerg表上有索引吗?这听起来更像我想要的,我会试试看,谢谢!看起来我t可以工作,但是性能是完全不可接受的,我将进行一个更简单的SQL调用,然后用java进行优化@bluefeet@Joerg表上有索引吗?这只是一个标准,用于格式化查询,以使WHERE 1和cond1和cond2具有更好的可读性。我不建议在所有情况下都使用它到处都是ries。如果没有其他原因的话,它的可读性就不会更高,因为它只是一段额外的代码,没有任何作用(有些人可能认为你在尝试做其他事情,但输入错误,或者可能不理解)。是的,你是对的,如果你没有条件,使用它没有任何目的,但对我来说,这是习惯的力量:)为什么所有这些
其中1
?它们有目的吗?你为什么不加上
HAVING 1
?由于很多抱怨,我删除了所有
WHERE 1
,正如我之前所说,这是一种习惯,从我的观点来看,我不应该因为有一个与其他人不同的查询编写标准而投反对票:)这只是一个设置查询格式的标准,包含WHERE 1和cond1和cond2更多这样可读。我不建议对任何地方的所有查询都使用此选项。如果不是因为其他原因,而是因为需要额外阅读一段代码而什么也不做(有些人可能认为你在尝试做其他事情,但输入错误,或者可能不理解)。是的,如果你没有条件,使用它也没有目的,但对我来说,这是习惯的力量:)为什么所有这些
其中1
?它们有目的吗?你为什么不加上
也有1
?由于许多抱怨,我删除了所有
WHERE 1
,正如我之前所说,这是一种习惯,从我的观点来看,我不应该仅仅因为与其他人有不同的查询编写标准而投反对票:)