我有两个表格,其值与下面的数据类似。
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中有一些算术运算。
答案 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中使用名称周围的引号。