43 lines
2.0 KiB
SQL
43 lines
2.0 KiB
SQL
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 ; |