Files
gyber/db/procedures/sp_search_users_for_autocomplete_paged.sql

43 lines
2.0 KiB
MySQL
Raw Normal View History

2025-09-15 13:33:34 +09:00
DELIMITER $$
CREATE PROCEDURE `sp_search_users_for_autocomplete_paged`(
IN p_search_term VARCHAR(255),
IN p_page_num INT,
IN p_page_size INT,
IN p_total_count_limit INT -- FOUND_ROWS() 계산 시 과도한 스캔 방지용 (선택적)
)
BEGIN
DECLARE v_offset INT;
IF p_page_num IS NULL OR p_page_num < 1 THEN SET p_page_num = 1; END IF;
IF p_page_size IS NULL OR p_page_size < 1 THEN SET p_page_size = 10; END IF;
SET v_offset = (p_page_num - 1) * p_page_size;
-- 실제 데이터 조회 (페이지네이션 적용)
SELECT SQL_CALC_FOUND_ROWS DISTINCT -- DISTINCT 유지, SQL_CALC_FOUND_ROWS 추가
user_id,
CASE
WHEN display_name IS NOT NULL AND display_name != '' AND account_name IS NOT NULL THEN CONCAT(display_name, ' [', account_name, ']')
WHEN display_name IS NOT NULL AND display_name != '' THEN display_name
ELSE account_name
END AS user_display_name
FROM user_info
WHERE
(p_search_term IS NULL OR p_search_term = '' OR
LOWER(display_name) LIKE CONCAT('%', LOWER(p_search_term), '%') OR
LOWER(account_name) LIKE CONCAT('%', LOWER(p_search_term), '%'))
ORDER BY user_display_name
LIMIT v_offset, p_page_size; -- OFFSET, LIMIT 순서 주의
-- 전체 결과 수 조회 (LIMIT 절에 의해 영향받지 않음)
-- p_total_count_limit 값은 이 SELECT 문의 LIMIT 과는 별개로,
-- FOUND_ROWS()가 너무 큰 테이블 전체를 스캔하는 것을 방지하기 위한 최적화 기법으로 사용될 수 있으나,
-- MySQL/MariaDB 에서 FOUND_ROWS()는 이전 SELECT 문의 LIMIT을 무시하고 실제 필터링된 전체 행 수를 계산합니다.
-- 따라서 p_total_count_limit 파라미터는 여기서는 직접적인 용도가 없을 수 있습니다.
-- 만약 필요하다면, 별도의 COUNT(*) 쿼리를 조건부로 실행하는 등의 로직을 추가할 수 있습니다.
SELECT FOUND_ROWS() AS total_count;
END
$$
DELIMITER ;