Как использовать процедуру MySql для отображения результатов на основе некоторых входных фильтров, игнорирующих другие фильтры, если они не введены пользователем во внешний интерфейс?

Я хотел бы использовать процедуру при нажатии кнопки более детального поиска, в которой, если я введу все входные значения, то это отображает соответствующий результат. Но я хотел бы сделать мою процедуру более динамичной, чтобы в случае, если я не вводил заголовок, он отображал все записи, основанные на других фильтрах, включая эквивалентные значения для заголовка игры. Кроме того, если платформа или полнота или какое-либо другое значение отсутствует, то также должно возвращаться результат запроса для всех возможных фильтров. Итак, как я могу добиться этого в MySql?

Я хочу узнать ниже вызов процедуры

call sp_search_Records_on_all_conditions('S','Extreme Sports','3',' ',' ' ,'Good','2000-11-07','2011-06-15',12,67);

или же

call sp_search_Records_on_all_conditions('S',' ','3',NULL,' ','Good','2000-11-07','2011-06-15',12,67);

Ниже процедура:

USE `videogame_collection_1`$$
CREATE PROCEDURE `sp_search_Records_on_all_conditions` (IN Game_Name_ip     VARCHAR(100),IN Genre_ip ENUM('Controllers', 'Extreme Sports', 'Action &     Adventure', 'Racing', 'RPG', 'Baseball', 'Sports', 'Systems', 'Puzzle',     'Fighting', 'Strategy', 'FPS', 'Wrestling', 'Accessories', 'Soccer', 'Other',     'Football', 'Party', 'Arcade', 'Basketball', 'Simulation', 'Music'),
IN Rating_ip ENUM('1', '2', '3', '4', '5'),IN Platform_Name_ip ENUM('N64',      'NES', 'Super Nintendo', 'Gamecube', 'Wii', 'Playstation 1', 'Playstation 2',     'Playstation 3', 'Xbox', 'Xbox 360', 'Sega Genesis', 'Atari 2600', 'Gameboy     Color', 'Gameboy Advance'),IN Completeness_Type_ip ENUM('B', 'I', 'C', 'BC',     'BI', 'IC', 'BIC'),     IN Condition_ip ENUM('New', 'Mint', 'Very Good', 'Good',    'Acceptable', 'Poor'),
IN from_Purchase_date_ip DATE,IN to_Purchase_date_ip DATE ,IN     from_Purchase_Price_ip DECIMAL(4,2), IN to_Purchase_Price_ip DECIMAL(4,2))
Begin
SELECT 
    video_game.Game_Name,
    video_game.Genre,
    video_game.Rating,
    platform.Platform_Name,
     mycollection.Completeness_Type,
      mycollection.`Condition`,
    mycollection.Purchase_Date,
    mycollection.Purchase_Price
        FROM
    video_game
        INNER JOIN
    video_game_platform_mycollection ON video_game.Game_Id =     video_game_platform_mycollection.Game_Id
        INNER JOIN
    platform ON video_game_platform_mycollection.Platform_Id =     platform.Platform_Id
         INNER JOIN
    mycollection ON video_game_platform_mycollection.MyCollection_Id =     mycollection.MyCollection_Id
     where video_game.Game_Name  LIKE CONCAT('%', Game_Name_ip, '%') and       video_game.Genre=Genre_ip and video_game.Rating=Rating_ip
     and platform.Platform_Name=Platform_Name_ip and      mycollection.Completeness_Type=Completeness_Type_ip and     mycollection.`Condition`= Condition_ip
    and mycollection.Purchase_Date between from_Purchase_date_ip and     to_Purchase_date_ip and   mycollection.Purchase_Price >=from_Purchase_Price_ip     and mycollection.Purchase_Price<= to_Purchase_Price_ip;
 END
$$

DELIMITER ;

1 ответ

Я бы, вероятно, проверил значение каждого параметра в операторе where. Вот начало:

where 
((Game_Name_ip is null OR len(trim(Game_Name_ip)) > 0) OR video_game.Game_Name  LIKE CONCAT('%', Game_Name_ip, '%')) and
...

В общем, вы должны проверить, является ли значение пустым или строкой, содержащей только пробел. Если это ложно, то это означает, что есть контент для поиска, поэтому вы будете проверять фактическое значение названия игры по указанному параметру Game_Name_ip. Повторите этот шаблон для каждого значения в выражении WHERE.

Другие вопросы по тегам