Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL请求两个组响应,并仅检索每个响应的最后一行_Mysql - Fatal编程技术网

Mysql SQL请求两个组响应,并仅检索每个响应的最后一行

Mysql SQL请求两个组响应,并仅检索每个响应的最后一行,mysql,Mysql,我有一张没有身份证的桌子。它有3列:计算机名称、轮询时的状态(开/关)和插入的时间戳 如果我跑 select * from computers group by name; 每台计算机我都有一行(有200种不同的),但这些行并不总是包含最新的条目。 然后我试着 select computers group by name order by timestamp asc; 但我得到了不连贯的回答(一些是最近的时间戳,一些是旧的…不知道为什么) 这与这里的问题基本相同:,但我没有ID来帮助:(您可

我有一张没有身份证的桌子。它有3列:计算机名称、轮询时的状态(开/关)和插入的时间戳

如果我跑

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:
(名称、时间戳)
上的一个索引应该会有很大帮助。