设计一个具有多个参数和HAVING LIKE的存储过程

时间:2011-07-16 08:11:56

标签: mysql sql

我正在尝试编写一个存储过程,用

搜索一个相当简单的数据库
  • USER表(user_id,name,...)
  • USER_TYPE表(user_id,type_id) - 多对多
  • TYPE表(type_id,type_name)
  • 一个USER_GAME(user_id,game_id) - 多个到多个
  • 一个GAME表(game_id,game_name)

同一个用户可以拥有多个游戏。现在,我希望能够根据特定类型和某个特定游戏获得用户,以便例如我可以获得所有用户,比如type1,并且与游戏一起说game2和game5。我认为我可以通过将它们作为字符串参数传递来解决几个游戏名称的问题,并做一些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 个答案:

答案 0 :(得分:1)

更改此行:

EXECUTE statement USING @p1,@p2;

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

这会导致LIKE表达式只是'%%',这意味着“匹配所有内容”