[英]How to optimize SQL query and return count using inner join and subquery
我们得到的结果是正确的,但执行时间过多。能否优化查询以减少执行时间。
SELECT c.client_id
FROM client_master c
INNER JOIN user_visit_record u ON u.client_id = c.client_id
WHERE c.dept_id ='1'
AND c.branch_id='1'
AND c.client_status IN('Hot','Warm','Cold','Quotation')
AND u.next_followup_date < '2017-06-01'
AND u.visit_id IN
(SELECT max(visit_id)
FROM user_visit_record
WHERE client_id=c.client_id)
提前致谢。
这是优化的查询:
SELECT c.client_id
FROM client_master c
JOIN (SELECT * FROM user_visit_record u ORDER BY u.visit_id DESC) AS t ON t.client_id = c.client_id
WHERE c.dept_id ='1'
AND c.branch_id='1'
AND c.client_status IN('Hot','Warm','Cold','Quotation')
AND t.next_followup_date < '2017-06-01'
GROUP BY t.clientid
我在查询中使用*,您可以做的是仅选择必填列,一种优化方式
和MySQL有几个现有的解决方案,检查此文章
SELECT c.client_id
FROM
(SELECT *
FROM client_master
WHERE dept_id ='1'
AND branch_id='1'
AND IN('Hot','Warm','Cold','Quotation')) AS c
INNER JOIN
(SELECT *
FROM user_visit_record
WHERE next_followup_date < '2017-06-01'
AND visit_id IN
(SELECT max(visit_id)
FROM user_visit_record
WHERE client_id=c.client_id)) AS u
ON u.client_id = c.client_id
尝试这个 :
SELECT client_id FROM
(
SELECT client_id
FROM client_master
WHERE dept_id ='1' AND branch_id='1' AND client_status IN('Hot','Warm','Cold','Quotation')
) AS c
NATURAL JOIN
(
SELECT client_id
FROM user_visit_record
INNER JOIN (
SELECT client_id, max(visit_id) as max_visit
FROM user_visit_record
GROUP BY client_id
) AS max_user_visit
ON (user_visit_record.client_id = max_user_visit.client_id)
AND (user_visit_record.visit_id = max_visit)
WHERE next_followup_date < '2017-06-01'
) AS u
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.