如何创建一个sql,它获取每个唯一记录的最后插入记录?

时间:2016-01-11 10:55:53

标签: php mysql sql group-by

我有一张桌子(检查),每当检查员到访车站时,它就会被填满。

当管理员尝试查看inspect表时,我想显示满足这些条件的所有记录:

  1. 每条记录必须包含唯一的电台名称

  2. 显示的记录必须是该特定电台的最后更新记录

  3. 截至目前,我使用的sql是

    $sql = "select `StationID`,`DOI`,`due`,`StationName` from inspect group by `StationID`";
    

    这显示完美,但它显示每个唯一电台的第一条记录。

    E.g。如果表有

    StationID StationName      DOI         due
    924         RMC      17-Mar-2014
    924         RMC      20-Mar-2016    
    926         IMD      23-Jan-2018                
    926         IMD      18-Jan-2018                
    926         IMD      18-Jan-2018                
    926         IMD      18-Jan-2018     19-Jan-2019    
    

    我的sql必须显示

    924 RMC 20-Mar-2016
    926 IMD 18-Jan-2018 19-Jan-2019
    

2 个答案:

答案 0 :(得分:1)

这个问题有一些重要的问题,因为这个问题确实需要澄清。但是,如果我们做出以下假设,就有可能。

  • StationName是您想要分组的
  • StationID是唯一的递增ID(主键)

以下查询可行。

select a.StationID, a.DOI, a.due, a.StationName from inspect a
where a.StationID = (
  select max(b.StationID) from inspect b  
  where b.StationName = a.StationName
)
group by a.StationName;

正如fiddle

所示

回到那些假设......我认为要实现你想要的,你必须拥有一把主键。因此,如果StationID不是主键,则需要添加一个并使用该列。

修改
这个问题现在已经改变了,因为我怀疑它有错误。您可以对StationID或StationName进行分组并获得相同的结果,以便该位无关紧要。但我不认为你可以通过该表结构得到你想要的结果。

首先,你需要一种方法来获得“最后更新的记录”。您目前没有专栏告诉您这一点。 DOI列显然为您提供了线索但它不是唯一的,并且您在那里有三行具有相同的日期。无法依赖到期列,因为它通常为空。

其次,一旦你拥有该列,就无法使用它来仅选择组中的那条记录。您只能使用主键执行此操作。如果你没有办法引用一行,这不是一个好的表设计。它完全排除了任何类型的连接。

答案 1 :(得分:0)

$sql = "select * 
        from `inspect` 
        group by `StationID` 
        order by str_to_date(`DOI`, '%d-%b-%Y') desc";

您需要将DOI列转换为实际日期,以便引擎可以对其进行适当排序。