본문으로 바로가기

예제 쿼리

category 웹/웹.리눅스.SQL 2009. 7. 6. 15:04

중복 레코드 갯수 구하기
SELECT rownum, uid, cnt
FROM (
  select uid, count(uid) cnt
  from member
  group by name
  having count(uid) > 1
)


mysql 에서 ROWNUM

SELECT
@RNUM:=@RNUM+1 AS ROWNUM , a.*
FROM (SELECT @RNUM:=0) R, table a


Top 100 순위를 뿌려주는 mysql query를 만들었다.


SELECT @RNUM:=@RNUM+1 AS ROWNUM ,a.* FROM (SELECT @RNUM:=0) R,
  (
   select a.account, sum(score) as score from table1 a
   where a.account = b.account group by a.account order by score desc
   ) a limit 100

table1과 2를 join한다음 그 값을 rownum먹인다.


누적된 갯수에서 ROWNUM
SELECT @ROWNUM := @ROWNUM + 1 AS ROWNUM, LEFT(dateInput, 10) dI, farmer
FROM tbl_selector_input, (SELECT @ROWNUM := 0) R
WHERE isDel = 'n'          -- 조건 : 삭제 되지 않은 데이터
GROUP BY dI, farmer      -- 정렬순 : 1.날짜 2.생산자명
HAVING COUNT(dI) > 1  -- 조건 : 날짜 2009-07-01 형태로 구분
ORDER BY dI DESC        -- 정렬순 : 날짜 역순으로 정렬


SELECT ROWNUM, dI, farmer
FROM (
SELECT @ROWNUM := @ROWNUM + 1 AS ROWNUM, LEFT(dateInput, 10) dI, farmer
FROM tbl_selector_input, (SELECT @ROWNUM := 0) R
WHERE isDel = 'n'
GROUP BY dI, farmer
HAVING COUNT(dI) > 1
ORDER BY dI DESC
) A
-- WHERE A.ROWNUM < 200

tbl_selector_input 테이블에서 날짜별(시간제외,LEFT(dateInput, 10))로 입력된 값을 그룹으로 묶고 해서
레코드 숫자만큼 rownum 이 먹히는걸 확인했습니다. 

    while(rs.next()) {
        ++i_total_no;
    }
이런 형태보다는 좀더 시간이 줄어 들었을 걸로 생각됩니다. ㅎㅎㅎ.


-- ROWNUM 샘플
SELECT    @ROWNUM := @ROWNUM + 1 AS ROWNUM,    TEST_TABLE.* FROM    TEST_TABLE,    (SELECT @ROWNUM := 0) R


ROWNUM을 이용하여 다른 작업을 하기위해서는 다음과 같이 서브쿼리를 이용하면 된다.


SELECT    A.*FROM(    SELECT        @ROWNUM := @ROWNUM + 1 AS ROWNUM,        TEST_TABLE.*     FROM        TEST_TABLE,       (SELECT @ROWNUM := 0) R) AWHERE    A.ROWNUM < 100


UNION 과 JOIN 의 차이점
A테이블            B테이블

num  name         num  total

1   홍길동         1    60
2   홍길순         3    80

 

1. union
select * from A
union
select * from b
----------------
1 홍길동
2 홍길순
1 60
3 80


2. join

select * from A join B on A.num=B.num
--------------------
1 홍길동 1 60


select * from A left outer join B on A.num=B.num
--------------------
1 홍길동 1      60
2 홍길순 null null


select * from A left outer join A on A.num=A.num
--------------------
1 홍길동 1 홍길동
2 홍길순 2 홍길순


예제에서도 알 수 있듯이 union은 두개 테이블을 연속해서 보여주는 것이고 join은 두개 테이블을 조건에 맞에 합해주는 것이죠.
그리고 같은 테이블끼리 조인 됩니다.