2013-02-13 67 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

相關問題