循环遍历DISTINCT行

时间:2013-06-17 05:33:26

标签: php sql

我将此表用于我正在制作的网络面板:

enter image description here

在特定页面上,显示每个服务器的最新存档,这意味着它必须查看不同的服务器ID并按降序时间戳对其进行排序,如图所示。

enter image description here

目前我必须运行SELECT DISTINCT server_id FROM archives ORDER BY time DESC,但这意味着我必须在PHP中使用foreach运行其他查询以获取存档的其余字段({{1 }})。

是否有单个SQL语句可以获取按id, job_id, time, sha1_sum, file_name, size降序排序的每个server_id的最新存档?在一个查询中完成所有操作将更容易和更清晰的代码。

编辑:我应该注意,网络表格中的结果列表是错误的,因为当下面的存档更新时,15/06/2013的结果会显示在顶部。

2 个答案:

答案 0 :(得分:1)

您可以组合使用GROUP BYMAX

SELECT server_id,MAX(time), id, job_id, time, sha1_sum, file_name, size FROM archives GROUP BY server_id

答案 1 :(得分:0)

这是"max in group" problem的另一种变体,是SQL新手似乎最常见的问题。

解决问题的一种方法是使用correlated subquery来识别在各自组中拥有最长时间的所有档案。

SELECT
  a.server_id,
  a.id, a.job_id, a.time, a.sha1_sum, a.file_name, a.size
FROM 
  archives a
WHERE
  NOT EXISTS (
    SELECT 1 
    FROM archives 
    WHERE server_id = a.server_id AND time > a.time
  )
ORDER BY 
  time DESC 

索引(server_id, time)并在外部查询上执行GROUP BY,如果您希望同一server_id的某些归档具有相同的time值。