DB 구성 : isnotice 컬럼은 0 아니면 1로 구성되어 있고, 값이 1이면 공지사항, 0이면 일반글이다.
SELECT * FROM zcompany
WHERE (1)
ORDER BY isnotice desc, cname
이게 기본적인 SQL문.
여기서 고려해야 할 점은
1. 검색어(stx)가 들어가면 공지사항 띄우지 않게 하기.
2. 필드별 정렬기능이 있기 때문에 클릭하더라도 공지사항이 움직이지 않고 그대로 고정되어 있는 상태로 필드별 정렬기능이 작동해야 된다.
1번은 쉽다.
검색어(stx)가 비어 있지 않으면,
order by절이 " order by cname "
처럼 isnotice 컬럼과 상관없게 되므로 하던 그대로를 써주면 된다.
2번이 문제인데
order by isnotice, cname
order by isnotice, cname desc
order by isnotice, ceo
order by isnotice, ceo desc
등으로 구성하면 공지사항 순서가 뒤바뀌는 결과가 나타난다.
그렇다고 order by isnotice, cname, ceo desc 처럼 3개를 잡아서 쓰더라도 원하는 값을 구하지 못함.
결론은 union all을 쓴다는 것.
---------------------------------------
공지사항 관련 select문
limit 공지사항 갯수
union all
일반 list
limit 일반 갯수(안써도 되지만 union이기 때문에 위 공지사항 코드와 형식을 맞추기 위해 사용해야함.)
order by 절
limit 페이징스타트페이지, perpagenum
---------------------------------------
위와 같이 구성할 건데 참고로 union all은 order by 절이 무조건 한줄 밖에 쓰지 못한다.
그래서 원하는 값을 얻기 위해서는 머리를 굴려야 함!
원하는 order by 절을 만들기 위해서는 임의로 순서에 관한 컬럼을 생성하고, 그 순서로 정렬 시키면 된다.
실제 존재하는 컬럼만 가지고는 부족하기 때문에..
1. isnotice라는 실제 존재하는 컬럼은 공지사항인지 아닌지로만 판단하고, 순서에 관여하는 sql에 사용하지 않는다. (이걸로 판단할 수도 있지만 기왕이면 코드를 깔끔하고 쉽게 보게 하기 위해.)
2. 정렬은 숫자가 들어있는 컬럼을 만들어 사용하면 쉽기 때문에 숫자를 생성해서 서로 비교하자.
3. sql문에서 임시 컬럼을 생성하는건 select문에 ,를 찍고 숫자를 적으면된다.
ex)
<!-- 공지사항 관련 조회 -->
select *, 1 as num
from zcompany
where (1) and isnotice=1
union all
<!-- 일반 게시물 관련 조회 -->
select *, 2 as num
from zcompany
where (1) and isnotice=0
다음과 같이 작성하면
이와 같이 n1 과 2라는 값들이 들어 가 있는 num이라는 컬럼이 생성된다.
이 num이라는 컬럼은 전체 게시물 조회할 때, 공지사항이 먼저, 일반게시물이 나중에 보일 수 있도록 만들어준다.
4. 그 다음은 공지사항 게시물 순서가 바뀌지 않도록 고정 시키기.
보통 게시판 게시물은 최신게시물이 앞으로 가도록 구성된다. 이를 위해 id가 큰 것으로 내림차순하게 만들어준다.
이를 위해 select문에 (id*-1 as num2) 를 추가해 줌.
(select *, 1 as num, id*-1 as num2
from zcompany
where (1) and isnotice=1
)
UNION all
(select *, 2 as num, 0 as num2
from zcompany
where (1) and isnotice=0
)
order by num, num2, id DESC;
union all 이기 때문에 일반 게시물 sql문에도 num2를 적어주지만, 이는 공지사항을 위한 컬럼이지, 일반게시물 정렬과는 관련 없기 때문에 0을 집어 넣음.
최종 sql문
(select *, 1 as num, id*-1 as num2
from zcompany
where (1) and isnotice=1
)
UNION all
(select *, 2 as num, 0 as num2
from zcompany
where (1) and isnotice=0
)
order by num, num2, id DESC;
♣ 추신!!
공지사항 고정시키기와 관련해 개인적으로 착각 한 것이 있는데,
공지사항의 개수 제한 (limit)을 내가 해줘야 한다고 생각함.
사실 그럴 필요는 없었다. 공지사항은 최신 공지사항을 보여주거나 하는게 아니라, 관리자가 원하는 공지사항을 보여주는 것!! 관리자가 글 개수를 관리해야지 코드를 쳐서 구현한 것이 아니다.
하지만, 어렵게 구성했기 때문에....
그 과정을 적어 보겠다.
처음 작성한 코드는
(select *, 1 as num, id*-1 as num2
from zcompany
where (1) and isnotice=1
limit 2)
UNION all
(select *, 2 as num, 0 as num2
from zcompany
where (1) and isnotice=0
)
order by num, num2, id desc
이 코드의 문제는 공지사항의 정렬이 id 정렬 순으로 잘려나가 limit에 원하는 값을 얻지 못하는 문제가 있었다.
즉, 최신순으로 잘라내고 싶었지만, 그 반대였던 것.
결국 공지사항 부분에 order by를 써야 한다는 의미인데 이를 구현하려면 서브쿼리를 사용해야한다.
최종 sql문
select *, 1 num, id*-1 as num2
FROM (
(SELECT * from zcompany where isnotice=1 ORDER BY ID DESC LIMIT 2) AS K
)
UNION all
(select *, 2 num, 0 as num2
from zcompany
where (1) and isnotice=0
)
order by num, num2, id DESC;
'Java' 카테고리의 다른 글
[java]Mybatis에서 #{}과 ${}차이 (0) | 2023.06.14 |
---|---|
[java]서버, jsp, servlet 버전 확인하는 방법 (0) | 2023.04.18 |
[java] 초기 환경설정 오류 잡기 (jdk-20) (0) | 2023.04.13 |
[java]Eclipse console창 한글깨짐 해결방법 (0) | 2023.04.07 |