【问题标题】:MySQL: count votes for usersMySQL:为用户计票
【发布时间】:2013-11-08 14:12:18
【问题描述】:

我正在寻找一种方法来计算 MySQL 数据库中用户的选票。

表格和列:

companion
 - companion_id
 - news_id
 - user_id
news
 - news_id
 - user_id
user
 - user_id
 - user_name
vote
 - vote_id
 - news_id
 - user_id

查看SQL Fiddle Live Demo

条件:

  • 每个用户可以有几个新闻
  • 每个新闻都可以有多个投票
  • 每个新闻可以有多个同伴(同伴是用户)
  • 每个用户可以投票给几个新闻(对于这个查询不重要)

目标:

现在我想弄清楚一个用户总共有多少票:在他自己的新闻上,他作为同伴链接在一起。解决方案应该是单个 MySQL 查询。

User2 的示例:

  • User21 篇新闻文章。这篇新闻文章有 2 票。
  • User21 文章的伴侣。这篇新闻文章有 3 票。
  • User2 应该有 5

方法:

以下查询结果为 31 而不是 5,因为它无法将其正确分组到 2 个不同的表中。

SELECT   u.user_name,
         u.user_id,
         COUNT(v.vote_id) AS votes
FROM     user u,
         news n,
         companion c,
         vote v
WHERE    u.user_id = 2 AND
         (
           (
             u.user_id = n.user_id AND
             n.news_id = v.news_id
           ) OR
           (
              u.user_id = c.user_id AND
              c.news_id = v.news_id
           )
         )
GROUP BY u.user_id
LIMIT    1

【问题讨论】:

  • 要求代码的问题必须表明对所解决问题的最低理解。包括尝试的解决方案,以及它们为什么不起作用。

标签: mysql


【解决方案1】:

不加入,联合是关键。请注意,您必须更改 user_id 两次。随意加入 users 表以获取真实的用户名。

查看它在sqlfiddle 中的实时工作。

SELECT   u.user_name, 
         count(*)
FROM
(
         SELECT news_id,
                user_id
         FROM   news
         WHERE  user_id = 2
         UNION ALL
         SELECT news_id,
                user_id
         FROM   companion
         WHERE  user_id = 2
)        sq
JOIN     vote v 
ON       v.news_id = sq.news_id
JOIN     user u
ON       sq.user_id = u.user_id
GROUP BY sq.user_id;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多