设计一个存储过程与多个参数和具有类似于
问题描述:
我试图写一个存储过程,将搜索一个相当简单的数据库与设计一个存储过程与多个参数和具有类似于
- 用户表(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,'%').
我希望是很清晰得到任何东西。如果有人有任何建议,要解决这个问题,我将非常感激。 非常感谢你很多
答
更改此行:
EXECUTE statement USING @p1,@p2;
到
EXECUTE statement USING @p1, ifnull(@p2, '');
这将导致LIKE
表达只是'%%'
,意思是“百搭”
感谢波希米亚,但不幸的是抛出当我尝试一个语法错误 – bstenm