이런식으로 쿼리를 짜려면 어떻게 해야할까요? 0 18 3,865

by 준일정 [MySQL] mssql mysql oracle sql query [2018.03.22 09:23:42]


sql쿼리 질문2.PNG (75,221Bytes)

이런식으로 쿼리를 짜고 싶습니다.

(mysql사용중)

웹 게시판 하나 만들고 있는데요 

 

페이지당 보여지는 row의 수를 3으로 지정하였구요 

한 페이지에 나타난 3개의 row만 오름차순으로 정렬하고 싶은데 어떤식으로 해야할까요.. 

 

즉, parameter=1을 받은경우  index 0,1,2 만 내림차순정렬하고 나머지 인덱스는 그대로 두고 

     parameter=2를 받은경우 3,4,5 만 내림차순하고 나머지 0,1,2,3,4,5,6,7,8,9,10 은 그대로 두고 

     parameter=3을 받은경우 6,7,8 만 내림차순하고 나머지 0,1,2,3,4,5,6,7,8,9,10 은 그대로 두고 

이런식으로 쿼리를 짜고싶은데 어떻게 해야할까요?

 

 

by 우리집아찌 [2018.03.22 09:51:40]

PAGING 말씀하시는건가요?


by 준일정 [2018.03.22 09:57:57]

네 맞아요 각 페이지에만 나타난 데이터들만 오름차순 하고싶은데 페이징이 유지되려면 나머지 데이터는 가만이 있어야 해서요 


by 우리집아찌 [2018.03.22 10:16:29]

3개씩 보여준것이 아니라 12개중 3개만 내림차순 해서 보여준다는건가요?


by 준일정 [2018.03.22 10:20:36]

네 만약 0,1,2번 인덱스의 데이터를 내림차순 하고 

나머지 남은 인덱스들은 그냥 그대로 있어야 합니다. 

 

결론적으로는 매번 쿼리가 실행될 때마다 모든 row는 다 가져 오는데 해당 인덱스들만 내림차순되느것이죠


by 우리집아찌 [2018.03.22 10:37:00]
--  ORACLE 로 구현되어있습니다. MY-SQL로 변환 하셔야 할겁니다.

WITH T ( NM , IDX )AS (
SELECT '정준일' ,0 FROM DUAL UNION ALL
SELECT '장현수' ,1 FROM DUAL UNION ALL
SELECT '김범수' ,2 FROM DUAL UNION ALL
SELECT '호랑이' ,3 FROM DUAL UNION ALL
SELECT '고릴라' ,4 FROM DUAL UNION ALL
SELECT '신정규' ,5 FROM DUAL UNION ALL
SELECT '정재희' ,6 FROM DUAL UNION ALL
SELECT '임하윤' ,7 FROM DUAL UNION ALL
SELECT '이찬규' ,8 FROM DUAL UNION ALL
SELECT '김금식' ,9 FROM DUAL UNION ALL
SELECT '홍준표' ,10 FROM DUAL 
)

SELECT * 
  FROM ( SELECT  TRUNC(IDX/3) + 1 GP 
               , NM 
               , IDX  
               , COUNT(*) OVER() - ROWNUM AS IDX_DESC
           FROM T 
        )  
  ORDER BY GP , CASE WHEN GP = 1 THEN IDX_DESC ELSE IDX END    -- <= GP = 1 : PARAMETER 값으로 넣어주세요.

 

 


by 준일정 [2018.03.22 10:43:54]

읔,, 오라클이 어렵네요 오라클을 안싸봐서 ㅜㅜ


by 우리집아찌 [2018.03.22 10:50:39]

IDX/3으로 하여 그룹만드시고 -> GP

IDX의 보수값으로 변환 -> IDX_DESC

ORDER BY GP , CASE  WEHN GP="파라미터값" THEN IDX_DESC ELSE IDX END 

하시면 될것같습니다.

 


by 신이만든지기 [2018.03.22 10:54:00]
SELECT * 
  FROM ( SELECT  TRUNC(IDX/3) + 1 GP 
               , NM 
               , IDX  
               , row_number() over(order by idx desc) AS IDX_DESC
           FROM T
        )  
  ORDER BY GP , CASE WHEN GP = :gp THEN IDX_DESC ELSE IDX END; 

 

와~ 코드가 더 깔끔하네요.

그리고 인라인뷰에 정렬하지 않고 row_number를 쓰면 더 코드가 간결해지겠네요.


by 우리집아찌 [2018.03.22 10:58:47]

ORDER BY 는 실수로 ㅋㅋ  조금전에 삭제 했습니다. ( 맨날 실수합니다 ㅋㅋ)

다른분의 SQL은 잘보이는데 제건 안보이네요. ㅎㅎ

보수로 처리한다고 어렵게 했네요.. ROW_NUMBER면 쓰면 되는데 ^^*

 


by 준일정 [2018.03.22 11:03:30]

감사합니다 되긴하는데 공부를 위해서 어떻게 작동되는지 파해쳐보겠습니다. 실례지만 몇년차정도 되면 이런걸 짤 수 있을까요?


by 신이만든지기 [2018.03.22 10:48:15]
with t(name, age, inx) as (
select 'name1', 10, 0 from dual union all
select 'name2', 11, 1 from dual union all
select 'name3', 12, 2 from dual union all
select 'name4', 13, 3 from dual union all
select 'name5', 14, 4 from dual union all
select 'name6', 15, 5 from dual union all
select 'name7', 16, 6 from dual union all
select 'name8', 17, 7 from dual union all
select 'name9', 18, 8 from dual union all
select 'name10', 19, 9 from dual union all
select 'name11', 20, 10 from dual union all
select 'name12', 21, 11 from dual
)
select name, age, inx
    , part, row_idx
  from (
SELECT name, age, inx
     , floor(inx/3) part
     , row_number() over (order by inx asc) row_idx
  FROM T)
 order by part asc , case when part = :param - 1 then inx end desc nulls last, inx asc;

 


by 준일정 [2018.03.22 10:50:01]

mysql로 하려 하는데 어떻게 해야 할까요 ㅠㅠㅠㅠㅠㅠ


by 신이만든지기 [2018.03.22 10:54:38]

헉~ mysql이었군요.


by 신이만든지기 [2018.03.22 11:05:43]
SELECT * 
  FROM ( SELECT  floor(인덱스/3) + 1 as 구분 
               , 이름
               , 나이
               , 성별            
               , 인덱스
               , ( @rank := @rank + 1 ) AS 인덱스역순
           FROM Table as a,
               ( SELECT @rank := 0 ) AS b
           order by 인덱스 desc
        )  
  ORDER BY 구분 asc , CASE WHEN 구분 = @param THEN 인덱스역순 ELSE 인덱스 END asc;

mysql이 없어서 테스트는 못해봤는데, 이런식으로 한번 시도해 보세요.


by 마농 [2018.03.22 11:29:09]
-- MySQL --
SELECT name, age, gender, idx
  FROM t
 ORDER BY idx
 LIMIT (:page - 1) * 3, 3
;

-- ROW_NUMBER 를 지원하는 DB(MSSQL, Oracle 등) --
SELECT *
  FROM (SELECT name, age, gender, idx
             , ROW_NUMBER() OVER(ORDER BY idx) rn
          FROM t
        ) a
 WHERE rn BETWEEN (:page - 1) * 3 + 1 AND :page * 3
;

 


by 준일정 [2018.03.22 11:38:26]

이건 저도 생각한건데 나머지 데이터들은 조회가 안되서 사용할 수 없습니다 ㅎ


by 마농 [2018.03.22 13:46:37]
SELECT name, age, gender, idx
     , @rn := @rn + 1 rn
     , CEIL(@rn / 3) page
  FROM (SELECT name, age, gender, idx
          FROM t
         ORDER BY idx
        ) a
     , (SELECT @rn   := 0
             , @page := 2
        ) b
 ORDER BY page
     , CASE WHEN page = @page THEN -rn ELSE rn END
;

 


by 우리집아찌 [2018.03.22 14:13:39]

그냥 - 하나로 로 끝내 버리네요. 역시.. 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입