gpt4 book ai didi

mysql - 如何将这个 mysql 查询更改为高效的查询

转载 作者:行者123 更新时间:2023-11-29 19:14:28 26 4
gpt4 key购买 nike

我的表用户包含这些字段id,company_id,created_by,名称,图片

餐 table 代客包含id,vid,dept_id

表格购物车包含id,dept_id,map_id,购买,时间

为了获取详细信息,我编写了这个 mysql 查询

SELECT c.id, a.id, c.purchace, c.time
FROM user a
LEFT JOIN valet b ON a.vid = b.id
AND a.is_deleted = 0
LEFT JOIN cart c ON b.dept_id = c.dept_id
WHERE a.company_id = 18
AND a.created_by = 102
AND a.is_deleted = 0
AND c.time
IN ( SELECT MAX( time ) FROM cart WHERE dept_id = b.dept_id )

从这三个表中,我想从购物车中选择最后更新的原始数据以及映射在代客表中的用户表中的 ID

此查询工作正常,但检索详细信息需要大约 15 秒。有什么方法可以改进这个查询,或者我可能做错了。任何帮助将不胜感激

最佳答案

一方面,我可以看到您正在为每一行运行子查询。根据优化器的作用,这可能会产生影响。 max是一个相当昂贵的操作(除了读取每一行之外没有别的办法)。

如果您打算重复更新和使用此查询,也许您至少应该在 cart.time 上为表建立索引。 。这将使找到最大值变得更加容易。

MySQL 有用户变量的概念,因此您可以将变量设置为子查询的结果,这可能会有所帮助:

SELECT c.id, a.id, c.purchace, c.time
FROM
user a
LEFT JOIN valet b ON a.vid = b.id AND a.is_deleted = '0'
LEFT JOIN cart c ON b.dept_id = c.dept_id
LEFT JOIN (SELECT dept_id,max(time) as mx FROM cart GROUP BY dept_id) m on m.dept_id=c.dept_id
WHERE
a.company_id = '18'
AND a.created_by = '102'
AND a.is_deleted = '0'
AND c.time=m.mx;

另请注意:

  • 因为您只测试 c.time 的单个值(最大值) ,您应该使用 =不是in .
  • 我不确定你为什么使用字符串而不是整数。我应该认为去掉引号更有意义。
  • 您的JOIN包括AND a.is_deleted = '0' ,尽管您在表格描述中没有提及它。无论如何,为什么会出现在 JOIN 中?而不是在WHERE中条款?

关于mysql - 如何将这个 mysql 查询更改为高效的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42826928/

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