2017-01-05 3 views
2

У меня есть 3 таблицы, подобные этому. Мне нужно, чтобы получить общее количество голосов, и общий комментарий, данные пользователей в одном запросеmysql получить сумму стоимости и количество пользователей из разных таблиц

пользователей таблица

id username 
1 A 
2 B 
3 C 
4 D 
5 E 

голоса табличных

id user_id value 
1  2  1  
2  3  1 
3  1  1 
4  4  1 
5  1  1 

комментарии таблицы

id user_id 
1  1 
2  2 
3  3 
4  3 
5  4 

мне нужна результат как это. Я использовал левое соединение. его двойной результат. любой может помочь в этом?

username total_votes total_number_of_verdict 
A    2     1 
B    1     1 
C    1     2 
D    1     1 
+0

Что такое полный вердикт? какой запрос вы использовали? – e4c5

ответ

1

попробовать это с использованием соединения слева

SELECT u.username,COALESCE(p.cnt,0) AS post_count,COALESCE(c.cnt1,0) AS 
post_count FROM users u 
LEFT JOIN 
(SELECT COUNT(*) AS cnt,uid FROM 
votes GROUP BY uid) p 
ON (p.uid = u.id) LEFT JOIN (SELECT COUNT(*) AS 
cnt1,user_id FROM comments GROUP BY user_id) c ON (c.user_id = u.id); 

check here on sqlfiddle

если вы хотите игнорировать которые пользователь не получил commments и голоса затем использовать следующий запрос

SELECT u.username,COALESCE(p.cnt,0) AS post_count,COALESCE(c.cnt1,0) AS 
post_count FROM users u 

LEFT JOIN (SELECT COUNT(*) AS cnt,uid FROM votes GROUP BY uid) p ON (p.uid = u.id) LEFT JOIN (SELECT COUNT(*) AS cnt1,user_id FROM comments GROUP BY user_id) c ON (c.user_id = u.id) where cnt not in (0); check here

+0

Спасибо за ответ. Это работает. Я хочу игнорировать пользователей, которые не дают никаких голосов и комментариев. –

+0

@ ShaƞkarSBavaƞ принимаю ответ. – denny

+0

Я имел в виду, что результаты показывают, если пользователь не дает никаких голосов и комментариев. –

0
SELECT UserTable.Username AS Username, SUM(VotesTable.Value) AS SUMVotes, COUNT(CommentTable.User_Id) AS SUMComments 
FROM UserTable 
LEFT JOIN VotesTable ON VotesTable.User_Id = UserTable.UserId 
LEFT JOIN CommentsTable ON UserTable.User_Id = CommentsTable.User_Id 

И если вы хотите, вы можете добавить

WHERE UserTable.User_Id = @User_Id 

Все, что вы здесь делаете, начинаются с Usertable, потому что это ваш «самый высокий» Datatable. Затем вы соединяете другие таблицы с их внешними ключами User_Id.

В SELECT Заявление о том, что вы simplay выбираете SUM и COUNT, чтобы получить сумму голосов и графу всех комментариев, которые они написали.

Надежда, которая поможет вам понять, как построить эти утверждения. Если есть какие-либо проблемы, прокомментируйте, и я обновлю свой ответ. :)

+0

результаты показаны как double –

+0

@ ShaƞkarSBavaƞ они делают? : D Я думал, что SUM() возвращает Int. Если нет, вы можете 'CAST' ваши типы в другие. Что-то вроде этого: 'CAST (SUM (VotesTable.Value) AS int)' – Cataklysim

0

Попробуйте это:

select u.username, 
    v.total_votes, 
    c.total_number_of_verdict 
from users u left join (
    select user_id, sum(value) total_votes 
    from votes 
    group by user_id 
) v on u.id = v.user_id 
left join (
    select user_id, count(1) total_number_of_verdict 
    from comments 
    group by user_id 
) c on u.id = c.user_id; 
+0

результаты отображаются только в том случае, если пользователь дает голоса и комментарии. Я хочу показывать результаты, если пользователь дает хотя бы голосование или комментарии –

+0

@ ShaƞkarSBavaƞ Вам просто нужно изменить 'inner join' на' left join'. Обновлен мой ответ. – GurV

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