2

1 つ以上の列の値に基づいて結果をグループ化し、そのグループ内でいくつかの条件に一致する完全なレコードを返すことができる 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 を試しましたが、私が知る限り、それらはレコード全体を返しません。

補遺: 「最新」修飾子を「特定の日付より前」に変更する必要があるかもしれません

4

4 に答える 4

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 を参照してください

その後、のみを返したい場合は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 を参照してください

于 2013-02-13T15:46:11.197 に答える
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'

Modified Date には時刻も含まれず、1 日に複数の編集が行われる可能性があることに注意してください。このレコードには時刻コンポーネントも含まれていることを確認してください。

于 2013-02-13T15:46:40.167 に答える
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をチェックしてください

于 2013-02-13T15:48:51.730 に答える
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;
于 2013-02-13T16:01:13.920 に答える