Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql存储过程中的Set和select无法正常工作_Mysql_Sql - Fatal编程技术网

mysql存储过程中的Set和select无法正常工作

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

我有一个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 = 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语句中使用:=运算符时没有出现错误。