【问题标题】:Get total upvotes for each user for all his posts为每个用户的所有帖子获得总赞成票
【发布时间】:2017-05-03 07:52:31
【问题描述】:

数据库结构如下:

用户

[id] [name]    [etc...]
1    Echolot   ...
2    AnotherUser  ...

帖子

[id] [user_id] [title] [etc...]
1    1         Post1   ...
2    1         Post2   ...

posts_upvotes

[id] [post_id] [user_id (user who voted)] [value (1 or 0 or -1)]
1    1         1                          1
2    1         2                          -1
3    2         1                          1
4    2         2                          1

我正在尝试获取所有用户的列表以及他们所有的帖子sum(value)gathered 的总投票数,如下所示:

id: 1
name: Echolot
upvoteCount: 2

id: 2
name: AnotherUser
upvoteCount: 0

我已尝试使用以下查询,但没有成功,我得到了错误的值,而不是正确数量的结果:

          SELECT joinedUsers.id, joinedPosts.postCount, joinedPostsUpvotes.upvoteCount
          FROM users joinedUsers
          inner join (
            SELECT user_id, id, count(id) as postCount
            FROM posts
            GROUP BY user_id, id
          ) joinedPosts on joinedPosts.user_id = joinedUsers.id
          inner join (
            SELECT post_id, sum(value) as upvoteCount
            FROM posts_upvotes
            GROUP BY post_id
          ) joinedPostsUpvotes on joinedPostsUpvotes.post_id = joinedPosts.id
          GROUP BY joinedUsers.id, joinedPosts.postCount, joinedPostsUpvotes.upvoteCount

提前感谢您提供任何提示或解决方案。

编辑:添加了测试数据和预期结果。

【问题讨论】:

  • 显示测试数据和所需的输出。
  • @reds 感谢您的意见。我在我的问题中添加了一些数据和所需的输出。
  • 所以你计算的是用户投的赞成票,而不是其他人在他的帖子上投的票?
  • @StefanoZanini 不,我想统计所有用户帖子的投票数。就像总分概览一样。
  • 对不起,我误会了,你说的完全正确。一些答案应该会给你想要的输出

标签: mysql sql laravel


【解决方案1】:

你不需要所有这些子查询,你可以在userpostpost_upvotes之间使用一对left join

SELECT  t1.id, t1.name, count(distinct t2.id), sum(t3.value)
FROM    users t1
LEFT JOIN
        posts t2
ON      t1.id = t2.user_id
LEFT JOIN    
        posts_upvotes t3
ON      t2.id = t3.post_id
GROUP BY t1.id, t1.name

使用left join 而不是inner join 可确保您也显示没有帖子或没有投票的帖子的用户。

【讨论】:

  • 这很好用,非常感谢...我必须从 t2.count(distinct t2.id) 中删除 t2. 才能使其正常工作,否则它是完美的。
【解决方案2】:

我认为这对你有用:

SELECT u.id,
  u.name,
  COUNT(p.id)
  SUM(pu.value)
FROM users AS u
JOIN posts AS p
ON u.id = p.user_id
JOIN posts_upvotes AS pu
ON p.id = pu.post_id
GROUP BY u.id,
  u.name

如果我没有遗漏您的问题。

【讨论】:

    【解决方案3】:

    如果你想要计算某人投票的次数(未测试),我认为应该是这样的

    SELECT users.id, users.name, COUNT(posts_upvotes.id) as upvoteCount
          FROM users
          INNER JOIN posts_upvotes ON posts_upvotes.user_id = users.id
          GROUP BY users.id
    

    或者,如果您想要投票的总和:

    SELECT users.id, users.name, SUM(posts_upvotes.id) as upvoteSum
          FROM users
          INNER JOIN posts_upvotes ON posts_upvotes.user_id = users.id
          GROUP BY users.id
    

    或者在 Laravel 中,您可以使用查询生成器:https://laravel.com/docs/5.4/queries

    类似这样的:

    DB::table('users')
        ->join('posts_upvotes', 'users.id', '=', 'posts_upvotes.user_id'))
        ->groupBy('users.id')
        ->select('users.id', 'users.name', DB::raw('COUNT(posts_upvotes) as upvoteCount'))
        ->get();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-18
      • 2018-07-27
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      相关资源
      最近更新 更多