Mysql SQL请求两个组响应,并仅检索每个响应的最后一行
我有一张没有身份证的桌子。它有3列:计算机名称、轮询时的状态(开/关)和插入的时间戳 如果我跑Mysql SQL请求两个组响应,并仅检索每个响应的最后一行,mysql,Mysql,我有一张没有身份证的桌子。它有3列:计算机名称、轮询时的状态(开/关)和插入的时间戳 如果我跑 select * from computers group by name; 每台计算机我都有一行(有200种不同的),但这些行并不总是包含最新的条目。 然后我试着 select computers group by name order by timestamp asc; 但我得到了不连贯的回答(一些是最近的时间戳,一些是旧的…不知道为什么) 这与这里的问题基本相同:,但我没有ID来帮助:(您可
select * from computers group by name;
每台计算机我都有一行(有200种不同的),但这些行并不总是包含最新的条目。
然后我试着
select computers group by name order by timestamp asc;
但我得到了不连贯的回答(一些是最近的时间戳,一些是旧的…不知道为什么)
这与这里的问题基本相同:,但我没有ID来帮助:(您可以编写:
SELECT computers.name,
computers.status,
computers.timestamp
FROM ( SELECT name,
MAX(timestamp) AS max_timestamp
FROM computers
GROUP
BY name
) AS t
JOIN computers
ON computers.name = t.name
AND computers.timestamp = t.max_timestamp
;
上面使用此子查询为每个名称
查找最大的时间戳
:
SELECT name
MAX(timestamp) AS max_timestamp
FROM computers
GROUP
BY name
;
然后它从计算机
中收集字段,这些计算机的名称
和时间戳
与子查询返回的内容匹配
您的order by
子句无效的原因是它来得太晚了:它用于在已经确定要返回的记录之后,对要返回的记录进行排序。引用此主题:
服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的。此外,添加ORDER by
子句不能影响从每个组中选择值。在选择值之后对结果集进行排序,ORDER by
不会影响w这是服务器选择的值
另一种方法是编写一个相关子查询,完全不使用groupby
。这是:
SELECT name, status, timestamp
FROM computers AS c1
WHERE NOT EXISTS
( SELECT 1
FROM computers
WHERE name = c1.name
AND timestamp > c1.timestamp
)
;
查找计算机
中未被具有相同名称的较新行取代的所有行。使用联接可以执行相同的方法:
SELECT c1.name, c1.status, c1.timestamp
FROM computers AS c1
LEFT
OUTER
JOIN computers AS c2
ON c2.name = c1.name
AND c2.timestamp > c1.timestamp
WHERE c2.name IS NULL
;
这不太清楚,但可能会更好。您是否尝试过按名称、时间戳asc排序?您有多行用于每台计算机,并且希望使用时间戳colomn添加最后一行?@DavidBélanger是的,对于每台计算机,我希望最后一行addedit的工作方式与我所希望的完全相同,但请求耗时19秒,我的数据库是只有2天。它很快就会变得不可持续,我能做什么呢?@Cystack:我更新了我的答案,给出了一些不用groupby
的变体,可能会表现更好。(带有左外连接的版本可能表现最好,尽管它也是最不清楚的IMHO。)非常感谢。您认为我最好(更快地)重新编写和移植表,并为每个条目使用id吗?或者使用一个只保留每台计算机最后状态的附加表?@Cystack:(名称、时间戳)
上的一个索引应该会有很大帮助。