2017-03-16 51 views
0

我的表用户包含这些字段 ID,COM​​PANY_ID,CREATED_BY,名称,图像如何将这个MySQL查询更改为一个有效的一个

表代客包含 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) 

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

此查询可以正常工作,但需要将近15秒来检索详细信息。 有没有什么办法来改善这个查询或者可能是我做错了一些。 任何帮助,将不胜感激

+0

请添加示例数据,预期输出与文字你的查询会 –

回答

0

一方面,我可以看到,你正在运行每行的子查询。根据优化器的作用,这可能会产生影响。 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条款?
+0

我已经改变了字符串整数 – destroyer

+0

但考虑基于dept_id为最大(时间)将只显示一个部门,我必须把所有的部门但只有最后更新的时间 – destroyer

+0

@destroyer我在这里失明,但我已经提供了一个替代解决方案。 – Manngo

相关问题