gpt4 book ai didi

mysql - 编写此查询的另一种方法

转载 作者:行者123 更新时间:2023-11-29 02:16:29 25 4
gpt4 key购买 nike

编写此查询的另一种方法是什么?

我的服务器需要很多时间来执行这个:

SELECT c.id, c.franquicia_id, f.name, CONCAT(c.name,' ',c.surname) 
contacto, c.created, DATE_FORMAT(c.created,'%d-%m-%Y') fecha
FROM franquicias f, contacts c where f.id = c.franquicia_id
and c.created = (
select max(c2.created)
from contacts c2
WHERE c2.franquicia_id = c.franquicia_id
)
and f.contract_id=2
ORDER BY created DESC
limit 10

最佳答案

这个版本的子查询只需要为整个查询运行一次,而不是为外部查询的每一行运行一次。

SELECT c.id, c.franquicia_id, f.name
, CONCAT(c.name,' ',c.surname) AS contacto
, c.created, DATE_FORMAT(c.created,'%d-%m-%Y') AS fecha
FROM contacts AS c
INNER JOIN franquicias AS f
ON c.franquicia_id = f.id
AND f.contract_id=2
WHERE (c.franquicia_id, c.created) IN (
SELECT franquicia_id, max(created)
FROM contacts
GROUP BY franquicia_id
)
ORDER BY created DESC
LIMIT 10

或者,子查询可以在附加的 JOIN 中使用以进行过滤。

f.contract_id=2可以放在ON或者WHERE;但是(并且优化器可能会消除任何差异),将其保持在 ON 可以可能减少在 where 中检查的行,并使以后更容易将查询转换为LEFT JOIN 如果需要查找“没有 f 的 contract_id 2 的最新联系人”。

注意:索引 (franquicia_id, created) 应该改进子查询,以及针对它使用的 IN;它还应该改进 franquicia_id 上的现有 JOIN 条件。

关于mysql - 编写此查询的另一种方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38879707/

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