2017-05-04 70 views
1

我是一個新手與MySQL。我沒有找到與我的案例相對應的答案。 我寫了一個函數,應該返回false當在表「member_answer」中發現「apseudo」超過5次時。 問題是這個函數總是返回True。你能幫我嗎?我的Mysql的函數總是返回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 [email protected]; 

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


     ELSE 

      SET canContinueValidMail:= FALSE; 
      RETURN canContinueValidMail; 

     END IF ; 

    END 
+3

'varPseudo'和'@ varPseudo'不是一回事。 –

+0

謝謝你,我沒有注意到這一點。但即使我進行修正,它似乎也不起作用。也許這是一個像e4c5所說的矯枉過正的程序? – Tarsierseyesmaykill

回答

0

對於這個存儲過程似乎有點矯枉過正。除非我誤解了你的問題,像這樣的內部連接可以替代你的存儲過程。只需在應用程序代碼中檢查返回計數通常是一個班輪。

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

非常感謝e4c5。我用你的陳述,它運作良好。這意味着,即使算法看起來正確,矯枉過正也可能不起作用。 – Tarsierseyesmaykill

+1

我認爲戈登的評論解決了你的SP的具體問題。但通常我們不會爲簡單的任務編寫SP,而是將它們留給無法用簡單查詢完成的事情。即使這樣,很多人爭辯說,你在應用程序邏輯中而不是SP中實現這樣複雜的事情更好(我並不總是同意這一點) – e4c5

+0

我注意到那些更有經驗的人,所以它會是非常好,如果我可以製作一個功能性SP,就像我試過的一樣 它會幫助我詳細瞭解我去哪裏(使用我的代碼),但是我更喜歡我的代碼已經優化並且易於理解, 如果它保持較少線路,正如您幫助我那樣做。 對不起,我的英文。 – Tarsierseyesmaykill

0

有了您的幫助,我的代碼工作,通過成爲:

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 

謝謝。