如何从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注入的神奇疗法,这就是为什么我们仍在使用它们,尽管我们知道这并不完全正确。我们希望他们是魔法治疗的一部分。