2011-07-16 34 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

相关问题