我将此表用于我正在制作的网络面板:
在特定页面上,显示每个服务器的最新存档,这意味着它必须查看不同的服务器ID并按降序时间戳对其进行排序,如图所示。
目前我必须运行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的结果会显示在顶部。
答案 0 :(得分:1)
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
值。