2

データを含む MySQL テーブルがあり、実施された特定のテストの最新のエントリを選択したいと考えています。

table: research
columns: id (int), projectid (int), test (varchar),
         when (datetime), result (longtext)

行の例:

1, 6, "Test1", 01-01-2013 12:15, "AAAAA"
2, 6, "Test1", 01-01-2013 13:15, "BBBBB"
3, 6, "Test2", 01-01-2013 16:00, "CCCCC"
4, 6, "Test2", 01-01-2013 16:15, "DDDDD"
5, 6, "Test2", 01-01-2013 16:30, "EEEEE"

「テスト 1」の最新の結果が必要な場合は、..

SELECT *
FROM research
WHERE projectid=6 AND test='Test1'
ORDER BY when DESC limit 1

しかし、1 つのプロジェクトの各テストの最新の結果を 1 つのクエリで取得するにはどうすればよいでしょうか? 私は試した:

SELECT research.*
FROM research INNER JOIN (SELECT MAX(id) AS id
                          FROM research
                          WHERE projectid=".$ProjectId."
                          GROUP BY test) ids
     ON research.id = ids.id
WHERE research.projectid=".$ProjectId

しかし、テストの最新の結果は得られず、最も古い結果が得られます..

4

6 に答える 6

2

WHENサブクエリの背後にある考え方は、すべての projectid と testの最新の日付を個別に取得することです。その結果は、元のテーブルに結合されます。

SELECT  a.*
FROM    research a
        INNER JOIN
        (
            SELECT projectid, test, MAX(`when`) maxDate
            FROM research
            GROUP BY projectid, test
        ) b ON  a.projectid = b.projectid AND
                a.test = b.test AND
                a.`when` = b.maxDate
于 2013-01-03T10:37:04.640 に答える
1

日付のフィルターでaWHEREを使用できます。INmax(when)

select *
from research r
where r.projectid = 6
   and r.`when` in (select max(`when`)
                   from research
                   group by projectid, test);

デモで SQL Fiddle を参照してください

于 2013-01-03T10:40:29.150 に答える
1

これを試して:

SELECT test,when,result
FROM research r1
WHERE when = (SELECT max(when)
            FROM research r2
            WHERE r2.test=r1.test)
于 2013-01-03T11:13:22.080 に答える
0

したがって、すべてのプロジェクトのすべてのテストで、最大のwhen列を持つ行を取得するには、これを使用できます。

SELECT r.*
FROM research AS r 
  JOIN
    ( SELECT projectid, test, MAX(`when`) AS maxw
      FROM research
      GROUP BY projectid, test
    ) AS m
    ON  m.projectid = r.projectid
    AND m.test = r.test
    AND m.maxw = r.`when` ;

単一のプロジェクト (たとえば project 6) のすべてのテストについて:

SELECT r.*
FROM research AS r 
  JOIN
    ( SELECT test, MAX(`when`) AS maxw
      FROM research
      WHERE projectid = 6
      GROUP BY test
    ) AS m
    ON  m.test = r.test
    AND m.maxw = r.`when` 
WHERE r.projectid = 6 ;

上のインデックスは(projectid, test, when)、上記の両方のクエリの効率に役立ちます。


于 2013-01-03T10:40:16.763 に答える
0

以下のクエリを試してください。

SELECT `e`.* FROM (
SELECT `r`.*
FROM research `r`
ORDER By `r`.`when`
DESC
)`e`
WHERE `e`.`projectid`= $ProjectId GROUP BY `e`.`test`

これが役立つことを願っています。

ありがとう。

于 2013-01-03T10:40:41.213 に答える
0

テストで分割し、パーティション内で日付順に並べ替えます。分析関数を使用します。上/下の複雑なクエリは必要ありません...

于 2013-01-03T13:52:07.357 に答える