繁体   English   中英

MySQL查询:选择最新结果

[英]MySQL query: selecting latest results

我有一个包含数据的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

但是,如何在一个查询中获得单个项目中每个测试的最新结果? 我试过了:

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

但这并不能为我提供测试的最新结果,它可以为我提供最久的结果。

子查询背后的想法是,它分别为每个projectid和test获取最新的WHEN日期。 然后将其结果重新加入原始表中。

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

您可以将WHEREIN ,以过滤max(when)日期max(when)

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

参见带有演示的SQL Fiddle

尝试这个:

SELECT test,when,result
FROM research r1
WHERE when = (SELECT max(when)
            FROM research r2
            WHERE r2.test=r1.test)

因此,要获得每个项目的每个测试( 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` ;

对于单个项目的每个测试(例如项目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)的索引将有助于上述两个查询的效率。


请尝试下面的查询。

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

我希望这有帮助。

谢谢。

在分区内按测试分区和按日期排序。 使用分析功能。 无需在上方/下方进行复杂的查询...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM