Как использовать процедуру 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.