如何从MySQL中的连接表中获取值的总和?

时间:2018-04-24 04:32:10

标签: mysql join

我有两个表格,其值与下面的数据类似。

Scores Table      Posts Table
postId score      id   user
     1     1       1   me
     2    -1       2   you
     1     1       3   me
     2     2
     3     0

从这两个表中,我想计算具有存储过程的给定用户的分数,我称之为getScoreForUser(用户)。

在这个确切的情况下的结果将返回
CALL getScoreForUser(me) = 2
CALL getScoreForUser(you) = 1

到目前为止,我尝试过一些非常愚蠢的事情:

select score.scores FROM scores INNER JOIN posts ON (scores.postId=posts.id);

显然甚至没有接近。在这种情况下连接是否合适?

我很高兴自己添加它们,如果它更容易(例如,Node.js比MySQL更高效),虽然我知道MySQL中有一些算术运算。

4 个答案:

答案 0 :(得分:2)

我认为这应该可以解决问题,假设我已经正确理解了您的数据库架构:

SELECT id, SUM(scores.score) AS totalScore
FROM posts
JOIN scores
ON scores.postId = posts.id;

从那里,您应该能够按预期使用totalScore

这里的相关位是MySQL SUM() function,我们用它来累计所有分数。

答案 1 :(得分:2)

您根据ID对所有项目分数进行分组的查询将是:

SELECT
  a.id,
  SUM(b.scores) as score
FROM
  posts as a
LEFT JOIN
  Scores as b
ON
  a.id = b.postId
GROUP BY
  a.id

然后,您可以在存储过程中为特定ID添加where语句并添加where语句

答案 2 :(得分:0)

最终,这就是我使用的:

CREATE PROCEDURE getScoreForUser(IN inUser VARCHAR(255))
BEGIN
    SELECT id, SUM(scores.score) AS totalScore
    FROM posts
    JOIN scores
    ON scores.postId = posts.id
    WHERE posts.user = inUser;
END

我在Node应用程序中使用它,我们最初认为存储过程是sql注入的神奇方法,这就是为什么我们仍在使用它们,即使我们已经了解了#&# 39;不完全正确。

答案 3 :(得分:0)

对于这样一个简单的查询,使用存储过程似乎有点过分。如果您已经知道整数id,那么您就不需要JOIN了。但是,假设您要传递用户的名称,过程将如下所示:

DELIMITER //
DROP PROCEDURE IF EXISTS getScoreForUser //
CREATE PROCEDURE getScoreForUser(IN v_user VARCHAR(32))
BEGIN
  SELECT SUM(score) AS totalScore
  FROM posts p
  JOIN scores s
  ON (s.postId = p.id)
  WHERE p.user = v_user;
END //

DELIMITER ;

CALL getScoreForUser('me');

另外,请注意,您必须在程序的CALL中使用名称周围的引号。