我有一张桌子(检查),每当检查员到访车站时,它就会被填满。
当管理员尝试查看inspect表时,我想显示满足这些条件的所有记录:
每条记录必须包含唯一的电台名称
显示的记录必须是该特定电台的最后更新记录
截至目前,我使用的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
答案 0 :(得分:1)
这个问题有一些重要的问题,因为这个问题确实需要澄清。但是,如果我们做出以下假设,就有可能。
以下查询可行。
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
列转换为实际日期,以便引擎可以对其进行适当排序。