SQL仅选择最新项

时间:2018-06-18 10:48:06

标签: sql mariadb

我试图从我的数据库中读出一些值。 我想看到的是一个带有项目最新值的读数。我的系统基于日志。我想在屏幕上显示最新的日志。

Screenshot of the Table

蓝色=显示的内容 ///红色=我想看到的内容

我当前的SQL查询:

SELECT DISTINCT * FROM log WHERE active = '1' GROUP by name ORDER BY time_stamp DESC

我目前的输出:

id  name    nickname    speed   height  battery lat lng type    pilot   time_stamp Descending 1 active  
35  Falon 2     Falon 2     0   0   0   34.000000   12.000000   bird    Falon 2     2018-06-18 11:44:37     1
33  Falon 1     Falon 1     0   0   0   3.000000    8.000000    bird    Falon 1     2018-06-18 11:37:44     1

所以它确实只选择一个项目(因为DISTINCT。但是它显示了最旧的值。我想看到的是Falcon 1和Falcon 2.但是按时间戳排序。

我尝试的是将 DESC更改为ASC ,但它只会按名称更改读数。

我使用MySQL(MariaDB)和PHPmyAdmin来显示和执行命令。

4 个答案:

答案 0 :(得分:2)

您的查询毫无意义。您将select *group by一起使用,因此您有许多未汇总的列。这在大多数数据库中都不起作用,即使在最近的MySQL版本中也是如此(基于默认设置)。

select distinct没有做任何事情。

您想过滤数据,因此请使用where

select l.*
from log l
where l.time_stamp = (select max(l2.timestamp)
                      from log l2
                      where l2.active = 1 and l2.name = l.name
                     );

请注意,我删除了'1'周围的单引号。大概active是一个数字,比较应该是一个数字(如果active是一个字符串,那么使用单引号!)。

答案 1 :(得分:1)

MariaDB 10.2支持窗口聚合

WITH cte AS
 ( SELECT *,
      -- assign a row number per name, newest row first
      row_number() over (partition by name ORDER BY time_stamp DESC) as rn
   FROM log 
   WHERE active = '1'
 )
select * from cte
where rn = 1 -- return the latest row per name

答案 2 :(得分:0)

您误解了DISTINCT的使用情况。 DISTINCT将确保您只获得具有完全相同详细信息的行的一个副本。由于每一行都有不同的id值,因此绝不会出现这种情况。

您要查找的命令是LIMIT

SELECT * FROM log WHERE active = '1' GROUP by name ORDER BY time_stamp DESC LIMIT 0,1

LIMIT仅显示偏移量(0)和要返回的行数(1)之间的行数。如果您没有对分页感到厌烦,您只需指定要返回的行数:LIMIT 1

答案 3 :(得分:0)

使用分组依据选择*具有不可预测的结果,您无法确定它将为每个组选择哪个时间戳字段。

您需要添加

  

按名称分组,时间戳

然后你可以使用order by。

但是,如果您只想为每个组添加一个,则可以删除订单并添加

  

按名称分组,时间戳记有时间戳=最大值(时间戳)