MySQL选择最新日期 - 单表

时间:2014-12-05 17:55:00

标签: mysql

我有一个看起来像这样的表,我想为每个loc_id获取最新的insp_date的ID(insp_id)。

create table insp (
    insp_id int (10),
    loc_id int (11),
    insp_type varchar (150),
    insp_date date ,
    insp_active tinyint (2),
    insp_created timestamp ,
    insp_modified timestamp 
);

我尝试了来自Select latest record in table (datetime field)和其他人的“IN”策略,但这给了我两倍,因为一个loc_id的最新日期可能是另一个的非最新日期:

SELECT insp_id, loc_id, insp_active, insp_date
FROM insp 
WHERE insp_active = 1 
AND insp_date IN(SELECT MAX(insp_date) FROM insp WHERE insp_active = 1 GROUP BY loc_id)
ORDER BY loc_id ASC, insp_date DESC;

我设置了一个SQL小提琴,但添加各种GROUP BY和MAX似乎没有得到它。我觉得我需要加入一个子查询或类似的东西,但目前还不确定。

http://sqlfiddle.com/#!2/f95e0/1

谢谢, 安德鲁

4 个答案:

答案 0 :(得分:1)

执行join和聚合:

select i.*
from insp i join
     (select loc_id, max(isp_date) as maxid
      from insp
      group by loc_id
     ) lm
     on i.loc_id = lm.loc_id and i.isp_date = lm.maxid;

如果对同一位置重复最长日期,您仍然可能存在重复的风险。

答案 1 :(得分:1)

您需要检索每个位置的MAX日期,然后检索此日期的MAX insp_id

查询1

SELECT insp.loc_id, max(insp.insp_id)
FROM insp
INNER JOIN
    (SELECT loc_id, max(insp_date) as insp_date
     FROM insp 
     WHERE insp_active = 1 
     GROUP BY loc_id) AS mdate ON mdate.loc_id = insp.loc_id AND 
                                  mdate.insp_date = insp.insp_date
WHERE insp_active = 1 
GROUP BY insp.loc_id

<强> Results

| LOC_ID | MAX(INSP.INSP_ID) |
|--------|-------------------|
|      1 |                 1 |
|      2 |                40 |
|      3 |                48 |
|      4 |                37 |
|      5 |                49 |
|      6 |                39 |
|      7 |                50 |
|      8 |                46 |

更新:

如果特定日期只有一个有效检查,并且这始终是最新的活动检查,您可以这样做:

SELECT insp.loc_id, insp.insp_id
FROM insp
INNER JOIN
    (SELECT loc_id, max(insp_date) as insp_date
     FROM insp 
     WHERE insp_active = 1 
     GROUP BY loc_id) AS mdate ON mdate.loc_id = insp.loc_id AND 
                                  mdate.insp_date = insp.insp_date
WHERE insp_active = 1 

答案 2 :(得分:0)

SELECT insp_id 
FROM insp
WHERE insp_active = 1
GROUP BY loc_id
ORDER BY insp_date DESC;

答案 3 :(得分:0)

子查询是最常见的解决方案,但我过去常常使用不太标准的东西,因为在MySQL允许嵌套之前就是这样:

select max(concat_ws('|', insp_date, insp_id)) as result, loc_id
from insp
group by loc_id;

你会得到类似的东西:

2014-01-01|12
2014-02-14|19
...

然后你显然需要在你的应用程序中拆分它。请注意,它具有特定的MySQL方言,性能不高,但嵌套查询不是(或至少不是)。

http://sqlfiddle.com/#!2/f95e0/23/0