2013-02-13 62 views
2

我需要构建一个MySQL查询,我可以根据一个或多个列值对结果进行分组,然后返回该组中匹配某些条件的完整记录。MySQL需要返回组内结果集中的特定记录

采取如下图所示为代表我的数据表:

| ID | NAME | Editor | Modified date | Type | 
| 1 | doc1 | Smith | 2012-01-01 | A | 
| 2 | doc2 | Smith | 2012-03-03 | A | 
| 3 | doc1 | Jones | 2012-10-10 | A | 
| 4 | doc1 | Scott | 2011-01-01 | A | 
| 5 | doc2 | Boyd | 2013-01-01 | A | 
| 6 | doc3 | Smith | 2010-01-01 | B | 
| 7 | doc4 | Smith | 2010-03-03 | B | 
| 8 | doc3 | Jones | 2010-10-10 | B | 
| 9 | doc3 | Scott | 2009-01-01 | B | 
| 10 | doc4 | Boyd | 2011-01-01 | B | 

我要回有关的任何文件,即最近修改的记录。

| ID | NAME | Editor | Modified date | Type | 
| 3 | doc1 | Jones | 2012-10-10 | A | 
| 5 | doc2 | Boyd | 2013-01-01 | A | 
| 8 | doc3 | Jones | 2010-10-10 | B | 
| 10 | doc4 | Boyd | 2011-01-01 | B | 

或与之相关的A型

| ID | NAME | Editor | Modified date | Type | 
| 3 | doc1 | Jones | 2012-10-10 | A | 
| 5 | doc2 | Boyd | 2013-01-01 | A | 

我试图GROUP BY和HAVING而据我所知,他们将不会返回整个记录的moste最近修改的记录。

附录:这可能是我需要阿尔特的“最近”预选赛“之前给定的日期”

+0

要返回的两个结果是相互排斥的,不是吗? – 2013-02-13 15:41:43

+0

对于第一个结果,您是否尝试过“按修改日期的NAME排序”? – Slowcoder 2013-02-13 15:52:06

回答

1

使用子查询:

SELECT tbl.* FROM tbl 
INNER JOIN (
    SELECT max(Modifed_date) as newestRecordDate, Editor 
    FROM tbl 
    GROUP BY Editor 
) as Newest 
on tbl.Modifed_Date = Newest.NewestRecordDate 

按类型:

SELECT * FROM tbl 
INNER JOIN (
    SELECT max(Modifed_date) as newestRecordDate, Editor 
    FROM tbl 
    GROUP BY Editor 
) as Newest 
ON tbl.Modifed_Date = Newest.NewestRecordDate 
WHERE Type = 'A' 

注意,修改日期不包括时间的可能的问题为好,并具有更每天编辑一次 - 确保此记录也包含时间部分。

+0

看起来不错,路试会多一点.....有一些相当复杂的场景 – user1715656 2013-02-13 16:39:54

1

如果要返回最近修改的行,那么你可以使用:

select * 
from yourtable t1 
where `Modified date` = (select max(`Modified date`) 
         from yourtable t2 
         where t1.NAME = t2.NAME 
         group by `NAME`); 

SQL Fiddle with Demo

然后,如果您希望只返回那些type='A',那么下面的工作:

select * 
from yourtable t1 
where `Modified date` = (select max(`Modified date`) 
         from yourtable t2 
         where t1.NAME = t2.NAME 
         group by `NAME`) 
    and type = 'A'; 

SQL Fiddle with Demo

0

试试这个:

对于第一个问题:

SELECT a.ID, a.name, a.Editor, a.ModifiedDate, a.Type 
FROM tableName a 
INNER JOIN (SELECT b.name, MAX(b.ModifiedDate) ModifiedDate 
      FROM tableName b GROUP BY b.name 
      ) b ON a.name = b.name AND a.ModifiedDate = b.ModifiedDate 

输出

| ID | NAME | EDITOR |     MODIFIEDDATE | TYPE | 
-------------------------------------------------------------- 
| 3 | doc1 | Jones | October, 10 2012 00:00:00+0000 | A | 
| 5 | doc2 | Boyd | January, 01 2013 00:00:00+0000 | A | 
| 8 | doc3 | Jones | October, 10 2010 00:00:00+0000 | B | 
| 10 | doc4 | Boyd | January, 01 2011 00:00:00+0000 | B | 

并滤波Type='A'

SELECT a.ID, a.name, a.Editor, a.ModifiedDate, a.Type 
FROM tableName a 
INNER JOIN (SELECT b.name, MAX(b.ModifiedDate) ModifiedDate 
      FROM tableName b GROUP BY b.name 
      ) b ON a.name = b.name AND a.ModifiedDate = b.ModifiedDate 
WHERE a.Type = 'A' 

输出

| ID | NAME | EDITOR |     MODIFIEDDATE | TYPE | 
-------------------------------------------------------------- 
| 3 | doc1 | Jones | October, 10 2012 00:00:00+0000 | A | 
| 5 | doc2 | Boyd | January, 01 2013 00:00:00+0000 | A | 

入住这SQL FIDDLE DEMO

0
select * from your_table group by NAME order by Modified_Date DESC; 
select * from your_table where Type = 'A' group by NAME order by Modified_Date DESC; 
+0

好吧,是的,这是有效的。如果我想在2013-01-01之前更改最新版本,该怎么办?换句话说,如果简单地使用des排序不适用? – user1715656 2013-02-13 16:10:52

+0

如果您不想使用“order by”,那么您可以参考本主题中由“bluefeet”给出的答案。我提出了相同的疑问,但我已经为他的现场演示链接的答案投了票。 – Slowcoder 2013-02-13 16:20:15

相关问题