Я пытаюсь написать хранимую процедуру, которая будет искать довольно простую базу данных с
- таблицей USER (user_id, name, ...)
- таблицей USER_TYPE(user_id, type_id) - от нескольких к нескольким
- таблица TYPE (type_id, имя-типа)
- a 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,'%').
Надеюсь, это было достаточно ясно. Если у кого-нибудь есть какие-либо предложения, чтобы обойти эту проблему, я был бы очень благодарен. Спасибовам очень нравится.