2015-05-30 2 views
0

У меня есть всего 6 таблиц, в которых разная информация сохранёнаMySQL присоединиться к нескольким таблицам и сосчитать Query

Теперь мне нужен результат, в котором получает отсчет от 5 таблиц и выбрать все данные из главной таблицы, но если запись делает не существует, чем это должно быть нужно возвращать 0, а не строка не нашел, что проблема здесь

Я попытался ниже запроса, но не получил успеха

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 

Этот запрос выполняется, но не сделал получить точный результат. Я не совсем понимаю, почему.

Я надеялся, что кто-то здесь может мне помочь?

Спасибо!

+2

Опубликуйте некоторые примеры данных, фактические и ожидаемые результаты. –

+1

Вероятно, вы получаете меньше данных, чем ожидаете из-за того, что у вас есть INNER JOINS ... вы должны проверить, какая из них является основной, и присоединиться к другим с LEFT Join. – John

ответ

1

Возможно, вы не получили точный результат, потому что некоторые таблицы могут отсутствовать.

Хотя вы можете решить эту проблему с помощью LEFT JOIN, более безопасным решением является предварительно агрегировать данные:

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; 

Почему это лучше? Рассмотрим идентификатор, который содержит 5 комментариев, симпатий, антипатий, долей и тегов. Подход JOIN дает промежуточный результат с 5 * 5 * 5 * 5 * 5 = 3,125 промежуточных рядов. Вещи действительно могут выйти из-под контроля для популярных идентификаторов.

+0

Можно ли добавить условия условия в этот запрос? –

+0

@AnkitDoshi. , , Да . , , Во внешнем запросе или в предложениях 'on', в зависимости от того, что вы хотите. –

1

Использовать LEFT JOIN вместо JOIN. и вам не нужен пункт WHERE, так как вы присоединились к этим таблицам. И используйте функцию IFNULL для возврата 0 для нулевых значений. Вам необходимо изменить запрос следующим образом:

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 
Смежные вопросы