2011-07-16 40 views
2

我試圖寫一個存儲過程,將搜索一個相當簡單的數據庫與設計一個存儲過程與多個參數和具有類似於

  • 用戶表(USER_ID,姓名,...)
  • 一個USER_TYPE表(USER_ID,TYPE_ID) - 多向多
  • 類型表(TYPE_ID,TYPE_NAME)
  • 一個USER_GAME(USER_ID,game_id) - 多向多
  • 遊戲桌(game_id,GAME_NAME)

同一個用戶可以有幾個遊戲。現在,我希望能夠根據特定類型以及某個/某些特定遊戲來獲取用戶,以便例如我可以讓所有用戶使用type1和用遊戲,比如說遊戲2和遊戲5。我認爲我可以通過將它們作爲字符串參數傳遞並且做一些HAVING LIKE條件來解決幾個遊戲名稱的問題(我稱之爲get_user_spec('type1','game3,game5'))。 到目前爲止,我得到這一點:

CREATE DEFINER=`root`@`localhost` PROCEDURE `get_user_spec`(
         IN inTypeName VARCHAR(50), 
         IN inGameName VARCHAR(150) 
) 

BEGIN 

    PREPARE statement FROM 

    "SELECT u.user_id,t.type_name,GROUP_CONCAT(g.game_name) AS game 
    FROM user u 
    INNER JOIN user_type ut 
     ON u.user_id=ut.user_id 
    INNER JOIN type t 
     ON ut.type_id=t.type_id 
    LEFT JOIN user_game ug 
     ON u.user_id=ug.user_id 
    LEFT JOIN game g 
     ON ug.game_id=g.game_id 
    WHERE t.type_name=? 
    GROUP BY u.user_id 
    HAVING game LIKE CONCAT('%',?,'%') 
    ORDER BY u.user_id"; 

    SET @p1=inTypeName; 
    SET @p2=inGameName; 

    EXECUTE statement USING @p1,@p2; 

END 

但我真正的問題是,如果我沒有通過任何遊戲的名字,然後我想與TYPE1所有用戶(我然後調用get_user_spec(「TYPE1」 ,NULL)。但我不再作爲程序看到

HAVING game LIKE CONCAT('%',NULL,'%'). 

我希望是很清晰得到任何東西。如果有人有任何建議,要解決這個問題,我將非常感激。 非常感謝你很多

回答

1

更改此行:

EXECUTE statement USING @p1,@p2; 

EXECUTE statement USING @p1, ifnull(@p2, ''); 

這將導致LIKE表達只是'%%',意思是「百搭」

+0

感謝波希米亞,但不幸的是拋出當我嘗試一個語法錯誤 – bstenm

相關問題