mysql存储过程中的Set和select无法正常工作
我有一个MySQl存储过程,它的行为异常,输出错误mysql存储过程中的Set和select无法正常工作,mysql,sql,Mysql,Sql,我有一个MySQl存储过程,它的行为异常,输出错误 CREATE PROCEDURE GetVotes(IN postId INT) BEGIN DECLARE upVotes INT DEFAULT 0; DECLARE downVotes INT DEFAULT 0; DECLARE stars INT DEFAULT 0; SET upVotes := ( SELECT count(upvote) FROM threadvote WHERE upvote = 1 AND postid
CREATE PROCEDURE GetVotes(IN postId INT)
BEGIN
DECLARE upVotes INT DEFAULT 0;
DECLARE downVotes INT DEFAULT 0;
DECLARE stars INT DEFAULT 0;
SET upVotes := ( SELECT count(upvote) FROM threadvote WHERE upvote = 1 AND postid = postId );
SET downVotes := (SELECT count(downvote) FROM threadvote WHERE downvote = 1 AND postid = postId );
SET stars := (SELECT count(starred) FROM threadvote WHERE starred = 1 AND postid = postId );
SELECT upVotes as numupvotes, downVotes as numdownvotes , stars as numstars;
END
它是如此简单,因为它给出了错误的输出,它仍然在消耗我的时间。
SET语句使用表中所有行的计数设置变量(即,它似乎忽略where子句)
示例数据:
itemid userid postid upvote downvote starred
9 15 9 1 0 0
12 16 9 1 0 1
13 15 7 1 0 0
14 15 8 1 0 1
15 16 7 1 0 1
16 16 8 0 1 0
17 16 11 0 1 0
18 15 11 0 1 0
现在调用getvows(8)代码>给了我:
numupvotes numdownvotes numstars
5 3 2
应该是:
numupvotes numdownvotes numstars
1 1 1
另外,使用@symbol声明会导致语法错误。e、 g
DECLARE @upVotes INT DEFAULT 0;
给出语法错误
请让我知道这里出了什么问题。
还是我缺少一些mysql服务器设置?您的名称有冲突问题。也就是说,postid=postid
几乎总是正确的。使用前缀来区分参数:
CREATE PROCEDURE GetVotes(IN in_postId INT)
BEGIN
DECLARE upVotes INT DEFAULT 0;
DECLARE downVotes INT DEFAULT 0;
DECLARE stars INT DEFAULT 0;
SELECT up_Votes := SUM(upvote = 1), downvote := SUM(downvote = 1),
stars := SUM(starred = 1)
FROM threadvote tv
WHERE tv.postid = in_postId;
SELECT upVotes as numupvotes, downVotes as numdownvotes , stars as numstars;
END
您的名称有冲突问题。也就是说,postid=postid
几乎总是正确的。使用前缀来区分参数:
CREATE PROCEDURE GetVotes(IN in_postId INT)
BEGIN
DECLARE upVotes INT DEFAULT 0;
DECLARE downVotes INT DEFAULT 0;
DECLARE stars INT DEFAULT 0;
SELECT up_Votes := SUM(upvote = 1), downvote := SUM(downvote = 1),
stars := SUM(starred = 1)
FROM threadvote tv
WHERE tv.postid = in_postId;
SELECT upVotes as numupvotes, downVotes as numdownvotes , stars as numstars;
END
您甚至不需要变量,请尝试以下方法:
SELECT
SUM(upvote) numupvotes,
SUM(downvote) numdownvotes,
SUM(starred) numstars
FROM threadvote t
WHERE t.postid = postId
另外,为了避免命名冲突,您最好在前面加上表名(或按表别名)您甚至不需要变量,请尝试以下操作:
SELECT
SUM(upvote) numupvotes,
SUM(downvote) numdownvotes,
SUM(starred) numstars
FROM threadvote t
WHERE t.postid = postId
此外,为了避免命名冲突,您最好通过在前面加上表名(或表别名)来指向表列名。将输入参数设置为不同的名称,如postid中的。很明显,和postid=postid
只是计算为true将输入参数设置为不同的名称,如postid中的。很明显,和postid=postid
的计算结果是真的我删除了sql server标记,因为语法建议使用MySQL。可能没有与字段同名的输入参数——就像postid
中的很明显,和postid=postid
的计算结果是真的。谢谢Hogan。因此,在MySQL中它不区分大小写。我删除了sql server标记,因为语法建议使用MySQL。可能输入参数与字段名称不同——比如postid
中的,显然和postid=postid
的计算结果是真的。谢谢Hogan。所以它在MySQL中不区分大小写。谢谢。关于名称冲突,你是对的。我曾经使用过sql server,它可以很好地工作。我的Sql当然有很多语法差异。但是您的查询仍然会在使用:=和Select语句时给我带来语法错误。虽然在set语句中使用:=运算符时没有出现错误。谢谢。关于名称冲突,你是对的。我曾经使用过sql server,它可以很好地工作。我的Sql当然有很多语法差异。但是您的查询仍然会在使用:=和Select语句时给我带来语法错误。尽管在set语句中使用:=运算符时没有出现错误。