공지글이 가장위로 그다음 ROWNUM을 DESC로 정렬하려고 하는데
홀수번째 ROWNUM이 빠져서 나옵니다..ㅠㅠ도와주세여
SELECT
CASE
T1.NOTI_YN
WHEN 'Y'
THEN '공지'
ELSE @ROWNUM := @ROWNUM + 1
END AS RNUM,
T1.*
FROM
(SELECT
'N' CHK,
A.ID,
A.CS_BBS_ID,
A.GRP,
A.SORT,
A.LV,
B.P_CATEGORY_ID,
C.CATEGORY_NM P_CS_CATEGORY_NM,
A.CS_CATEGORY_ID,
B.CATEGORY_NM CS_CATEGORY_NM,
A.TITLE,
A.CONTENTS,
A.NAME,
A.VIEWS,
A.NOTI_YN,
A.USE_YN,
A.USER_PWD,
A.UR_USER_ID,
A.USER_NAME,
DATE_FORMAT(A.CREATED, '%Y-%m-%d') AS CREATED,
A.MODIFIED,
(SELECT
COUNT(*)
FROM
CS_BBS_RECOM R
WHERE R.CS_BBS_ID = A.ID) AS CS_BBS_RECOM_CNT,
F.ID CS_BBS_ATTC_ID,
F.PHYS_ATTACHED,
F.REAL_ATTACHED
FROM
CS_BBS A
INNER JOIN CS_CATEGORY B
ON A.CS_CATEGORY_ID = B.ID
INNER JOIN CS_CATEGORY C
ON B.P_CATEGORY_ID = C.ID
LEFT OUTER JOIN CS_BBS_ATTC F
ON A.ID = F.CS_BBS_ID,
(SELECT
@ROWNUM := 0) R
WHERE 1 = 1
AND B.USE_YN != 'N'
AND C.USE_YN != 'N'
AND B.P_CATEGORY_ID = 1
ORDER BY A.GRP ASC,
A.SORT DESC) T1
ORDER BY CAST(RNUM AS INT) DESC
mysql 설치해서 테스트해봤는데요.
--SELECT절에 RNUM SELECT CASE FG WHEN 'Y' THEN '공지' ELSE @ROWNUM := @ROWNUM + 1 END AS RNUM , FG FROM ( SELECT A.FG, A.CODE FROM ( SELECT 'Y' FG, 'A' CODE UNION ALL SELECT 'Y' FG, 'A' CODE UNION ALL SELECT 'Y' FG, 'A' CODE UNION ALL SELECT 'N' FG, 'A' CODE UNION ALL SELECT 'N' FG, 'A' CODE UNION ALL SELECT 'N' FG, 'A' CODE UNION ALL SELECT 'Y' FG, 'A' CODE UNION ALL SELECT 'N' FG, 'B' CODE UNION ALL SELECT 'N' FG, 'B' CODE UNION ALL SELECT 'N' FG, 'B' CODE ) A ) B ,(SELECT @ROWNUM := 0) C ORDER BY CASE FG WHEN 'Y' THEN 99999 ELSE CAST(RNUM AS decimal) END DESC --결과 공지 Y 공지 Y 공지 Y 공지 Y 12 N 10 N 8 N 6 N 4 N 2 N --FROM절에 RNUM SELECT RNUM , FG FROM ( SELECT A.FG, A.CODE, CASE FG WHEN 'Y' THEN '공지' ELSE @ROWNUM := @ROWNUM + 1 END AS RNUM FROM ( SELECT 'Y' FG, 'A' CODE UNION ALL SELECT 'Y' FG, 'A' CODE UNION ALL SELECT 'Y' FG, 'A' CODE UNION ALL SELECT 'N' FG, 'A' CODE UNION ALL SELECT 'N' FG, 'A' CODE UNION ALL SELECT 'N' FG, 'A' CODE UNION ALL SELECT 'Y' FG, 'A' CODE UNION ALL SELECT 'N' FG, 'B' CODE UNION ALL SELECT 'N' FG, 'B' CODE UNION ALL SELECT 'N' FG, 'B' CODE ) A ) B ,(SELECT @ROWNUM := 0) C ORDER BY CASE FG WHEN 'Y' THEN 99999 ELSE CAST(RNUM AS decimal) END DESC --결과 공지 Y 공지 Y 공지 Y 공지 Y 6 N 5 N 4 N 3 N 2 N 1 N
이유는 공부해봐야겠네요.
CAST 문제였네요.
ORDER BY 절에서 CAST하게 되면 ROWNUM이 또 늘어나네요. 왜 그런지는 아직도 모르겠습니다.
--CAST 하지 않았을 때 SELECT A.FG, A.CODE , CASE FG WHEN 'Y' THEN @ROWNUM ELSE @ROWNUM := @ROWNUM + 1 END AS RNUM FROM ( SELECT 'Y' FG, '1' CODE UNION ALL SELECT 'Y' FG, '2' CODE UNION ALL SELECT 'Y' FG, '3' CODE UNION ALL SELECT 'N' FG, '4' CODE UNION ALL SELECT 'N' FG, '5' CODE UNION ALL SELECT 'N' FG, '6' CODE UNION ALL SELECT 'Y' FG, '7' CODE UNION ALL SELECT 'N' FG, '8' CODE UNION ALL SELECT 'N' FG, '9' CODE UNION ALL SELECT 'N' FG, '0' CODE ) A,(SELECT @ROWNUM := 0) B ORDER BY RNUM DESC --결과 N 0 6 N 9 5 N 8 4 Y 7 3 N 6 3 N 5 2 N 4 1 Y 1 0 Y 2 0 Y 3 0 --CAST했을 때 SELECT A.FG, A.CODE , CASE FG WHEN 'Y' THEN @ROWNUM ELSE @ROWNUM := @ROWNUM + 1 END AS RNUM FROM ( SELECT 'Y' FG, '1' CODE UNION ALL SELECT 'Y' FG, '2' CODE UNION ALL SELECT 'Y' FG, '3' CODE UNION ALL SELECT 'N' FG, '4' CODE UNION ALL SELECT 'N' FG, '5' CODE UNION ALL SELECT 'N' FG, '6' CODE UNION ALL SELECT 'Y' FG, '7' CODE UNION ALL SELECT 'N' FG, '8' CODE UNION ALL SELECT 'N' FG, '9' CODE UNION ALL SELECT 'N' FG, '0' CODE ) A,(SELECT @ROWNUM := 0) B ORDER BY CAST(RNUM AS decimal) DESC --결과 N 0 12 N 9 10 N 8 8 Y 7 6 N 6 6 N 5 4 N 4 2 Y 1 0 Y 2 0 Y 3 0
SELECT CASE T1.NOTI_YN WHEN 'Y' THEN '공지' ELSE RNUM END AS RNUM -- 요기 , T1.* FROM (SELECT @ROWNUM := @ROWNUM + 1 AS RNUM -- 요기 , 'N' CHK , A.ID , A.CS_BBS_ID , A.GRP , A.SORT , A.LV , B.P_CATEGORY_ID , C.CATEGORY_NM P_CS_CATEGORY_NM , A.CS_CATEGORY_ID , B.CATEGORY_NM CS_CATEGORY_NM , A.TITLE , A.CONTENTS , A.NAME , A.VIEWS , A.NOTI_YN , A.USE_YN , A.USER_PWD , A.UR_USER_ID , A.USER_NAME , DATE_FORMAT(A.CREATED, '%Y-%m-%d') AS CREATED , A.MODIFIED , (SELECT COUNT(*) FROM CS_BBS_RECOM R WHERE R.CS_BBS_ID = A.ID) AS CS_BBS_RECOM_CNT , F.ID CS_BBS_ATTC_ID , F.PHYS_ATTACHED , F.REAL_ATTACHED FROM CS_BBS A INNER JOIN CS_CATEGORY B ON A.CS_CATEGORY_ID = B.ID INNER JOIN CS_CATEGORY C ON B.P_CATEGORY_ID = C.ID LEFT OUTER JOIN CS_BBS_ATTC F ON A.ID = F.CS_BBS_ID CROSS JOIN (SELECT @ROWNUM := 0) R WHERE 1 = 1 AND B.USE_YN != 'N' AND C.USE_YN != 'N' AND B.P_CATEGORY_ID = 1 ORDER BY A.NOTI_YN ASC -- 요기 , A.GRP ASC , A.SORT DESC ) ORDER BY NOTI_YN DESC -- 요기 , GRP DESC -- 요기 , SORT ASC -- 요기 ;