简体   繁体   中英

How to optimize SQL query and return count using inner join and subquery

We are getting result proper but its taking too much time to execute.Can we optimise query which will take less time to execute.

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)

Thanks in advance.

Here is the optimized query:

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

I have Used * in query, you can do is select only required columns,one way of optimising

And MySQL has several existing solutions, check this Article

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

Try this :

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM