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 ;