2015-08-31 2 views
-1

Существует три таблицы. пользователь, как, комментарий. Таблица как и комментарий имеет строки, связанные с пользователь. Мне нужны все пользователи со связанным числом строк из таблицы как и комментарий. Это легко сделать, когда есть только одна связанная таблица. Однако, вот мой запрос.Подсчет связанных строк из нескольких таблиц с использованием левого соединения

SELECT u.id as id, u.display_name as displayName, 
     COUNT(x.user_id) as likeCount, 
     COUNT(y.user_id) as commentCount 
FROM `user` u 
    LEFT JOIN 
     `like` x ON x.user_id = u.id 
    LEFT JOIN 
     `comment` y ON y.user_id = u.id 
GROUP BY u.id 

Таблица отношений: Один пользователь имеет разные вкусы Один пользователь имеет много комментариев

commentCount дает подсчет правильных строк, но likeCount давая подсчитывать неправильные строки. Пожалуйста, не публикуйте ответ, который использует sub-запросы. Я хочу его только с предложением ONE SELECT. Я использую MySQL. ТИА

+0

привет, под редакцией. надеюсь, что это будет ясно сейчас. –

+0

И вы пытались использовать 'DISTINCT'? – Lamak

+1

«Пожалуйста, не отправляйте ответы с подзапросами« Я не вижу другого способа решить это. Что случилось с подзапросами? – AdamMc331

ответ

2

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

SELECT user, COUNT(*) AS t1Count 
FROM table1 
GROUP BY user; 

SELECT user, COUNT(*) AS t2Count 
FROM table2 
GROUP BY user; 

Затем вы можете присоединиться к тем, двум к Users столу, чтобы получить количество каждого. Вы должны использовать COALESCE() возвращать нулевые значения с 0:

SELECT u.id, COALESCE(t1.t1Count, 0), COALESCE(t2.t2Count, 0) 
FROM users u 
LEFT JOIN(
    SELECT user, COUNT(*) AS t1Count 
    FROM table1 
    GROUP BY user) t1 ON u.id = t1.user 
LEFT JOIN(
    SELECT user, COUNT(*) AS t2Count 
    FROM table2 
    GROUP BY user) t2 ON u.id = t2.user; 

Вот SQL Fiddle примера.

+0

Большое спасибо. Я искал этот ответ. оно работает. Еще раз спасибо. –

+0

@ mahbub.kuet рад, что я мог бы помочь. Если это решение, которое вы используете, не стесняйтесь принимать ответ, поэтому будущие читатели будут знать, как вы решили проблему. – AdamMc331

+0

Привет. вы там ? Я правильно выбрал ваш ответ, но просто отменил его, потому что ваше решение также использует подзапросы, и я заметил, что он занял примерно такое же время, как и решение с чистым подзапросом этой проблемы. Мне нужно решение без каких-либо подзапросов. Не могли бы вы сказать мне, возможно ли это. Я буду принимать ваш ответ снова через 12 часов, если я не получу больше решений. Пожалуйста, будьте терпеливы в течение следующих 12 часов. –

Смежные вопросы