Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 개발 어렵당.ㅠ
- Loki 로그
- reids
- LPOS
- 플루터
- Armeria
- 티스토리챌린지
- Ingress Controller Fake
- pinpoint
- ㅉ때
- 노드간 통신
- UnsupportedOperationException
- 애자일 싫타
- formik
- 월급루팡 일지
- 핀포인트
- 7879
- pinpoint 2.5.3
- hbase 저장공간 설정
- save/update
- 오블완
- OIDC
- nGinder
- intellij
- fake jwt
- R2DBC Paging
- jsonMarshaller
- jar 배포
- 논블록킹 성능
- RedirectService
Archives
- Today
- Total
대머리개발자
어색한 쿼리. 본문
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
'개발이야기 > DataBase' 카테고리의 다른 글
성능 - 조건절 OR (0) | 2025.01.20 |
---|---|
모든 쿼리는 index를 타야 제맛이쥐 (0) | 2024.09.04 |
CROSS JOIN 언제 쓸까 했는데.. (1) | 2024.07.09 |
마이그레이션(MyBatis -> R2DBC) 언제나 즐겁네! (0) | 2024.07.08 |
group_concat 속 문자 정렬하기 (0) | 2024.05.31 |