разработать хранимую процедуру с несколькими параметрами и иметь как - PullRequest
2 голосов
/ 16 июля 2011

Я пытаюсь написать хранимую процедуру, которая будет искать довольно простую базу данных с

  • таблицей 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,'%').

Надеюсь, это было достаточно ясно. Если у кого-нибудь есть какие-либо предложения, чтобы обойти эту проблему, я был бы очень благодарен. Спасибовам очень нравится.

1 Ответ

1 голос
/ 16 июля 2011

Измените эту строку:

EXECUTE statement USING @p1,@p2;

на

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

Это приведет к тому, что выражение LIKE будет просто '%%', что означает "соответствовать всему"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...