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

如何从MySQL中的联接表中获取值的总和?,mysql,join,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(user) 在这种情况下

我有两个表,其值与下面的数据相似

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(user)

在这种情况下,结果将返回
调用getScoreForUser(me)
=2
调用getScoreForUser(您)
=1

到目前为止,我已经尝试了一些相当愚蠢的事情:

select score.scores FROM scores INNER JOIN posts ON (scores.postId=posts.id);
这显然是不接近的。在这种情况下,联接是否合适


如果更简单的话,我很乐意自己添加它们(例如在Node.js中比在MySQL中更有效),尽管我知道MySQL中有一些算术运算可用。

我认为这应该可以做到,假设我正确理解了您的数据库模式:

SELECT id, SUM(scores.score) AS totalScore
FROM posts
JOIN scores
ON scores.postId = posts.id;
从那里,您应该能够按预期使用
totalScore


这里的相关位是,我们使用它来计算所有分数。

假设我正确理解了您的数据库模式,我认为这应该可以做到:

SELECT id, SUM(scores.score) AS totalScore
FROM posts
JOIN scores
ON scores.postId = posts.id;
从那里,您应该能够按预期使用
totalScore


此处的相关位是,我们使用它将所有分数相加。

您根据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语句,根据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语句

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

我在一个节点应用程序中使用了它,我们最初认为存储过程是sql注入的灵丹妙药,这就是为什么我们仍在使用它们,尽管我们知道这并不完全正确。

最终,我使用的是:

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

我在一个节点应用程序中使用了这一点,我们最初认为存储过程是sql注入的灵丹妙药,这就是为什么我们仍然使用它们,尽管我们知道这并不完全正确。

对于这样一个简单的查询,使用存储过程似乎有点过火。如果您已经知道整数id,则不需要联接。但是,假设您希望传入用户名,则过程如下所示:

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');

另外,请注意,在对过程的调用中,必须在名称周围使用引号。

对于这种简单的查询,使用存储过程似乎有点过分了。如果您已经知道整数id,则不需要联接。但是,假设您希望传入用户名,则过程如下所示:

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');

另外,请注意,在对过程的调用中,必须在名称周围使用引号。

我在一个节点应用程序中使用了引号,我们最初认为存储过程是sql注入的神奇灵丹妙药,这就是为什么我们仍在使用它们,尽管我们知道这并不完全正确。我们希望它们是神奇疗法的一部分。我在一个节点应用程序中使用了它,我们最初认为存储过程是sql注入的神奇疗法,这就是为什么我们仍在使用它们,尽管我们知道这并不完全正确。我们希望他们是魔法治疗的一部分。