mysql获取不同表中的值和用户计数之和

时间:2017-01-05 11:58:08

标签: mysql

我有3张这样的牌桌。我需要在一个查询中获得用户给出的总票数和总评论

用户表

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   

4 个答案:

答案 0 :(得分: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

如果你想忽略哪个用户没有获得通知和投票,那么使用以下查询

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

答案 1 :(得分:0)

你应该考虑阅读: https://www.sitepoint.com/understanding-sql-joins-mysql-database/ 让我们知道你已经尝试过的......

答案 2 :(得分: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开始,因为这是你最高的"数据表。然后用其外键User_Id连接其他表。

SELECT声明中,您选择SUMCOUNT来获取投票总数和所有评论的计数。

希望能帮助您了解如何构建这些语句。如果有任何问题,请发表评论,我会更新我的答案。 :)

答案 3 :(得分: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;