我试图从我的数据库中读出一些值。 我想看到的是一个带有项目最新值的读数。我的系统基于日志。我想在屏幕上显示最新的日志。
蓝色=显示的内容 ///红色=我想看到的内容
我当前的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来显示和执行命令。
答案 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。
但是,如果您只想为每个组添加一个,则可以删除订单并添加
按名称分组,时间戳记有时间戳=最大值(时间戳)