mysql global search procedure
DROP PROCEDURE IF EXISTS findAll;
DELIMITER $$
CREATE PROCEDURE findAll(IN `search` TEXT)
BEGIN
SET SESSION group_concat_max_len := @@max_allowed_packet;
SELECT GROUP_CONCAT(
"SELECT '", c1.TABLE_NAME, "' AS `table`, '", c1.COLUMN_NAME, "' AS `column`, ",
"CONCAT_WS(',', ",
(SELECT GROUP_CONCAT(CONCAT('`', c2.column_name, '`'))
FROM `information_schema`.`columns` c2
WHERE c1.TABLE_SCHEMA=c2.TABLE_SCHEMA
AND c1.TABLE_NAME=c2.TABLE_NAME
AND c2.COLUMN_KEY='PRI'),
") AS pri, ",
"CONVERT(`", c1.COLUMN_NAME, "` USING utf8mb4) COLLATE utf8mb4_general_ci AS value FROM `", c1.TABLE_NAME,
"` WHERE CONVERT(`", c1.COLUMN_NAME, "` USING utf8mb4) COLLATE utf8mb4_general_ci LIKE '%", search, "%'"
SEPARATOR "\nUNION\n"
) INTO @sql
FROM information_schema.columns c1
WHERE c1.TABLE_SCHEMA = DATABASE()
AND c1.DATA_TYPE IN ('char', 'varchar', 'text', 'tinytext', 'mediumtext', 'longtext');
-- End the query properly
SET @sql = CONCAT(@sql, ";");
-- Debug (optional): SELECT @sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END $$
DELIMITER ;
Comments
Post a Comment