gpt4 book ai didi

mysql - 将嵌套查询优化为单个查询

转载 作者:行者123 更新时间:2023-11-29 06:11:51 24 4
gpt4 key购买 nike

我有一个 (MySQL) 表,其中包含上次扫描主机的日期以及报告 ID:

+--------------+---------------------+--------+
| host | last_scan | report |
+--------------+---------------------+--------+
| 112.86.115.0 | 2012-01-03 01:39:30 | 4 |
| 112.86.115.1 | 2012-01-03 01:39:30 | 4 |
| 112.86.115.2 | 2012-01-03 02:03:40 | 4 |
| 112.86.115.2 | 2012-01-03 04:33:47 | 5 |
| 112.86.115.1 | 2012-01-03 04:20:23 | 5 |
| 112.86.115.6 | 2012-01-03 04:20:23 | 5 |
| 112.86.115.2 | 2012-01-05 04:29:46 | 8 |
| 112.86.115.6 | 2012-01-05 04:17:35 | 8 |
| 112.86.115.5 | 2012-01-05 04:29:48 | 8 |
| 112.86.115.4 | 2012-01-05 04:17:37 | 8 |
+--------------+---------------------+--------+

我想选择所有主机的列表,其中包含上次扫描的日期和相应的报告 ID。我已经构建了以下嵌套查询,但我确信它可以在单个查询中完成:

SELECT rh.host, rh.report, rh.last_scan
FROM report_hosts rh
WHERE rh.report = (
SELECT rh2.report
FROM report_hosts rh2
WHERE rh2.host = rh.host
ORDER BY rh2.last_scan DESC
LIMIT 1
)
GROUP BY rh.host

是否可以使用单个非嵌套查询来完成此操作?

最佳答案

不,但您可以在查询中执行 JOIN

SELECT x.*
FROM report_hosts x
INNER JOIN (
SELECT host,MAX(last_scan) AS last_scan FROM report_hosts GROUP BY host
) y ON x.host=y.host AND x.last_scan=y.last_scan

您的查询正在进行文件排序,效率非常低。我的解决方案没有。强烈建议在此表上创建索引

ALTER TABLE `report_hosts` ADD INDEX ( `host` , `last_scan` ) ;

否则您的查询将执行两次文件排序。

关于mysql - 将嵌套查询优化为单个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8740295/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com