简体   繁体   中英

mysql join with multiple tables and count query

I have total 6 tables in which different info has been saved

Now i need a result in which get count from 5 tables and select all info from main table but if record does not exist than it must be need to return 0 instead of no row found that's the problem here

I have tried below query but didn't get success

SELECT 
    u.*,
    COUNT(DISTINCT  c.id) as comments,
    COUNT(DISTINCT d.id) as dislikes,
    COUNT(DISTINCT l.id) as likes,
    COUNT(DISTINCT s.id) as shares,
    COUNT(DISTINCT t.id) as tags
FROM 
    job_details as u
    JOIN job_comments as c ON u.id = c.job_id
    JOIN job_dislike as d ON u.id = d.job_id
    JOIN job_like as l ON u.id = l.job_id
    JOIN job_share as s ON u.id = s.job_id
    JOIN job_tags as t ON u.id = t.job_id
WHERE 
    u.id = c.job_id AND
    u.id = d.job_id AND
    u.id = l.job_id AND
    u.id = s.job_id AND
    u.id = t.job_id

GROUP BY 
    u.id

This query is executed, but didn't get exact result. I don't quite understand why.

I was hoping somebody here could help me out?

Thanks!

Use LEFT JOIN instead of JOIN . and you don't need WHERE clause since you have joined those tables. And, use IFNULL function to return 0 for null values. You need to modify you query like this :

SELECT u.id,
    IFNULL(COUNT(DISTINCT  c.id),0) as comments,
    IFNULL(COUNT(DISTINCT d.id),0) as dislikes,
    IFNULL(COUNT(DISTINCT l.id),0) as likes,
    IFNULL(COUNT(DISTINCT s.id),0) as shares,
    IFNULL(COUNT(DISTINCT t.id),0) as tags
FROM job_details as u
    LEFT JOIN job_comments as c ON u.id = c.job_id
    LEFT JOIN job_dislike as d ON u.id = d.job_id
    LEFT JOIN job_like as l ON u.id = l.job_id
    LEFT JOIN job_share as s ON u.id = s.job_id
    LEFT JOIN job_tags as t ON u.id = t.job_id
GROUP BY u.id

You probably didn't get the exact result because some tables may be missing values.

Although you can solve this problem with a LEFT JOIN , the safer solution is to pre-aggregate the data:

SELECT u.*, c.comments, d.dislikes, l.likes, s.shares, t.tags
FROM job_details as u LEFT JOIN
     (select c.job_id, count(*) as comments from job_comments group by c.job_id
     ) c
     ON u.id = c.job_id LEFT JOIN
     (select d.job_id, count(*) as dislikes from job_dislike d group by d.job_id
     ) d
     ON u.id = d.job_id LEFT JOIN
     (select l.job_id, count(*) as likes from job_like l group by l.job_id
     ) l
     ON u.id = l.job_id LEFT JOIN
     (select s.job_id, count(*) as shares from job_share s group by s.job_id
     ) s
     ON u.id = s.job_id LEFT JOIN
     (select t.job_id, count(*) as tags from job_tags t group by t.job_id
     ) t
     ON u.id = t.job_id;

Why is this better? Consider an id that has 5 comments, likes, dislikes, shares and tags. The JOIN approach produces an intermediate result with 5*5*5*5*5 = 3,125 intermediate rows. Things can really get out of hand for popular ids.

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