我的Mysql函数总是返回true

我的Mysql函数总是返回true,mysql,Mysql,我是mysql的新手。我没有找到与我的情况相符的答案。 我编写了一个函数,当在表member_answer中发现apseudo超过5次时,该函数应返回false。 问题是这个函数总是返回True。你能帮我吗 DELIMITER // CREATE FUNCTION noMaxTryValideMail(theMail VARCHAR(150)) RETURNS BOOLEAN BEGIN /*This function returns True when

我是mysql的新手。我没有找到与我的情况相符的答案。 我编写了一个函数,当在表member_answer中发现apseudo超过5次时,该函数应返回false。 问题是这个函数总是返回True。你能帮我吗

DELIMITER //

CREATE FUNCTION noMaxTryValideMail(theMail VARCHAR(150)) RETURNS BOOLEAN

    BEGIN 

            /*This function returns True when we have at most 5 times "a pseudo"    in member_answer        */
      DECLARE varEmail VARCHAR(150);
      DECLARE varPseudo VARCHAR(35);

      DECLARE nbTry SMALLINT; 
      DECLARE canContinueValidMail BOOLEAN DEFAULT TRUE;

      SET varEmail := theMail;
      SET varPseudo := NULL;

      SELECT pseudo INTO varPseudo FROM inscription_member WHERE email_1 = varEmail;
      SELECT COUNT(pseudo) INTO nbTry FROM member_answer WHERE pseudo =@varPseudo; 

      IF nbTry >0 AND nbTry <6 THEN 
        SET canContinueValidMail := TRUE;
        RETURN canContinueValidMail;


      ELSE

          SET canContinueValidMail:= FALSE;
          RETURN canContinueValidMail;

      END IF ;

    END 

对于这个存储过程来说,存储过程似乎有点过头了。除非我误解了您的问题,否则像这样的内部联接可以替换存储过程。只需检查应用程序代码中的返回计数,通常为一行

SELECT COUNT(*) FROM inscription_member i INNER JOIN
member_answer m on m.pseudo = i.pseudo
 WHERE email_1 = ?

对于这个存储过程来说,存储过程似乎有点过头了。除非我误解了您的问题,否则像这样的内部联接可以替换存储过程。只需检查应用程序代码中的返回计数,通常为一行

SELECT COUNT(*) FROM inscription_member i INNER JOIN
member_answer m on m.pseudo = i.pseudo
 WHERE email_1 = ?

在您的帮助下,我的代码可以通过以下方式工作:

  CREATE FUNCTION maxTryValideMail2(theMail VARCHAR(150)) RETURNS BOOLEAN
        BEGIN 
            DECLARE nbtry SMALLINT;

            SELECT COUNT(*) INTO nbTry FROM inscription_member i INNER JOIN
            member_answer m on m.pseudo = i.pseudo
            WHERE email_1 = theMail ;

            return nbTry > 5;

        END 

谢谢。

在您的帮助下,我的代码可以通过以下方式工作:

  CREATE FUNCTION maxTryValideMail2(theMail VARCHAR(150)) RETURNS BOOLEAN
        BEGIN 
            DECLARE nbtry SMALLINT;

            SELECT COUNT(*) INTO nbTry FROM inscription_member i INNER JOIN
            member_answer m on m.pseudo = i.pseudo
            WHERE email_1 = theMail ;

            return nbTry > 5;

        END 

谢谢。

varPseudo和@varPseudo不是一回事。谢谢你,我没有注意到这一点。但即使我改正了,它似乎也不起作用。也许这是一个像e4c5所说的过度杀戮过程?varPseudo和@varPseudo不是一回事。谢谢你,我没有注意到这一点。但即使我改正了,它似乎也不起作用。也许这是像e4c5所说的过度杀戮程序?非常感谢,e4c5。我使用了你的声明,它运行良好。这意味着,即使算法看起来正确,过度杀戮过程也可能不起作用?我认为Gordon的评论解决了SP的特定问题。但通常我们不会为简单任务编写SP,而将它们留给简单查询无法完成的任务。即使如此,许多人认为,在应用程序逻辑中实现如此复杂的东西比作为SP更好。我并不总是同意这一点。我注意到那些更有经验的人,因此,如果我能像我尝试的那样制作一个功能性SP,那将是非常好的。这将有助于我详细了解我的代码,但我更希望我的代码是优化的,并且易于理解,如果它保持较少的行,就像你帮助我做的那样。对不起,我的英语不好。很高兴能帮上忙。我认为你是一个很好的学习者。祝你的项目一切顺利。非常感谢你,e4c5。我使用了你的声明,它运行良好。这意味着,即使算法看起来正确,过度杀戮过程也可能不起作用?我认为Gordon的评论解决了SP的特定问题。但通常我们不会为简单任务编写SP,而将它们留给简单查询无法完成的任务。即使如此,许多人认为,在应用程序逻辑中实现如此复杂的东西比作为SP更好。我并不总是同意这一点。我注意到那些更有经验的人,因此,如果我能像我尝试的那样制作一个功能性SP,那将是非常好的。这将有助于我详细了解我的代码,但我更希望我的代码是优化的,并且易于理解,如果它保持较少的行,就像你帮助我做的那样。对不起,我的英语不好。很高兴能帮上忙。我认为你是一个很好的学习者。祝你的项目一切顺利。