대머리개발자

어색한 쿼리. 본문

개발이야기/DataBase

어색한 쿼리.

대머리개발자 2025. 3. 31. 17:05
728x90

 

 

익숙하지 않는 쿼리는 어색하다.

 

정렬이 특정 친구를 먼저 앞으로 보내고나머지는 최신으로 내림차순하면 되는 부분이다.

 

순간적으로 생각난 부분은 두 번의 쿼리를 날려야겠다고 생각했다.

 

1. 특정 친구를 쿼리하고

2. 나머지 부분을  별도 쿼리

즉, 두개의 쿼리를 합쳐서(union all) 보내면 되겠다 싶었다.

 

하고자 하는 바는

카테고리(메뉴)별 최신 게시글을 하나씩 리스트업을 해야 하는데

특정 카테고리는 무조건 맨앞에 위치 해야 하는 Needs였다.

 

 

orber by 절에 조건이 들어가는 쿼리가 너무나 어색했다.

SELECT b.*
FROM board b
INNER JOIN (
    SELECT id, MAX(regDt) AS regDt, menuId
    FROM board where accessLevel = 5
    AND board.menuId > 0
    GROUP BY menuId
    ORDER BY IF(b.menuId IN (:menuIds), 0, 1), regDt desc
    limit 8
) latest ON b.id = latest.id
ORDER BY IF(b.menuId IN (:menuIds), 0, 1),
regDt desc

 

앞에 위치시켜야 하는 메뉴Id를 0으로 처리하고 나머지는 1로 처리해서 정렬하는 것이다.

사실 어색한게 아니고 생소했다. ㅎ

 

역시나 인덱스는 개나 주는 쿼리. ㅠㅠ

 

그러나 틀에박혀 있던 꼰대 같은 나의 뇌에 자극을 주었다.

 

먼저 생각했던 두 번의 쿼리.

(
    SELECT b.*
 		  ...
          AND menuId IN (1, 2, 3, 4) -- 우선 순위 menuId
        GROUP BY menuId
    ) latest ON b.id = latest.id
    ORDER BY b.menuId -- 우선순위 menuId 정렬
    LIMIT 4
)
UNION ALL
(
    SELECT b.*
		  ...
          AND menuId NOT IN (1, 2, 3, 4) -- 나머지 menuId
        GROUP BY menuId
    ) latest ON b.id = latest.id
    ORDER BY regDt DESC -- 최근 등록글 우선 정렬
     LIMIT 4
)

 

 

상황에 따라서 정답이 달라진다.

 

일단 accessLevel 자체가 매우 작은 범위라... 인덱스는 개를 줘도 되는 부분이다.

order by 비용이 무시가능한 수준으로 판단s

 

따라서 한방 쿼리로..

 

정답을 정해놓고.. 그것을 선택해야만 하는 이유를 찾늗다... 답정너.

 

 

 

728x90