database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 30312 게시물 읽기
No. 30312
멀티 between 문제
작성자
김인수
작성일
2012-08-29 10:07:14
조회수
4,354

 안녕하세요..

점수의 평균을 내야 하는데 조회 범위 목록 가져오는 부분이 약간 문제가 있어서.. 질문 드립니다.

두개의 between으로 처리 할려고 하는데 원하는 범위의 값을 가져올려고 하는데

--------------------------------------

데이터

column1,           column2, column3

                    1               1             100

                    1               2               70

                    1               3              50

                    2                1            100

                    2                2            80

                    3                1             70

                     3               2             60

                    3                 3            100

                    3                4             100

 

SELECT * FROM TABLE

  WHERE column1 BETWEEN 1 AND 2

         AND column2 BETWEEN 1 AND 2

----------------------------------------------------------------------

column1(1)(column2(1) ~ column1(2)~(column2(2)까지의 값을 가져오고 싶은데

위에처럼 조회를 하면 column1(1)column2(3)의 값(50점)은 조회조건에 포함이 안되어 나옴니다.

평균 값을 집계를 내면 100,70,50,100,80 다섯개의 평균으로 / 5 해서 90점이 나오게 하려는게 목표인데요

검색 범위 COLUMN2번의 1~2까지가 걸려버려서(조회결과가 5개여야 하는데 4개) 50점은 조회결과에 포함이 되질 않습니다.

 

범위 검색시 값 1번의 3번도 포함시켜서 할려면 어떻게 해야 하는지.. 헤메고 있습니다. 혹시 저런식의 범위 검색은 BETWEEN으로 하는게 아닌지..

힌트좀 주시면 감사하겠습니다.

 

이 글에 대한 댓글이 총 11건 있습니다.

column1, 2에 대한 조건으로 제시해주신 아래 문장의 의미가 정확히 무엇인지 이해가 안됩니다.

[ column1(1)(column2(1) ~ column1(2)~(column2(2)까지의 값을 가져오고 싶은데 ]

 

조건을 보다 명확하게 설명해주셔야 답변드릴 수 있을 것 같습니다.

 

박현우(lqez)님이 2012-08-29 13:43:13에 작성한 댓글입니다.

코딩으로 풀어쓰면

if( ( column1 >= 1 && column2 >= 1 ) && (  column1 <= 2 && column2 <= 2 )
와 같은것입니다..

괄호안은 컬럼 값을 의미 합니다.

컬럼1의 값이 1인것과 컬럼2의 값이 1인것 부터 
컬럼1의 값이 2인것과 컬럼2의 값이 2인거 까지의 목록을 조회하고싶습니다.

(1,1) ~ (2,1) 사이의 목록을 가져와라.
원하는 결과값 : 
(1,1) / (1,2) / (1,3) / (2,1) / (2,2)
실제 결과값 위쪽에서 (1,3)은 빠져버림.

헌데 
SELECT * FROM TABLE

  WHERE column1 BETWEEN 1 AND 2
         AND column2 BETWEEN 1 AND 2
를 하면 디비 데이터 중 컬럼1 값이 1이고 컬럼2값이 3인 목록이 결과값에서 빠져 버립니다 ㅜ

 

P.S 관심 가져주셔서 감사합니다.

 

김인수님이 2012-08-29 13:48:54에 작성한 댓글입니다.
이 댓글은 2012-08-29 13:51:28에 마지막으로 수정되었습니다. Edit

이리 저리 테스트 중인데

SELECT *
     FROM TABLE
 WHERE 블라블라
        AND ( CONCAT( column1, column2 ) BETWEEN 11 AND 22 )
하니 비슷하게 조회가 되는거 같습니다. 

제가 혹시 잘못하고 있는건지..

참고로 column1, column2 필드는 둘다 인트만 들어갑니다.

김인수님이 2012-08-29 14:12:26에 작성한 댓글입니다. Edit

말씀중에 끼어들어서 죄송합니다. 아래와 같은 조건이 맞는지요?

 

mysql> select * from tab1 where column1=1 and column2 >=1 union all

    -> select * from tab1 where column1=2 and column2 <=2;

+---------+---------+---------+

| column1 | column2 | column3 |

+---------+---------+---------+

|       1 |       1 |     100 |

|       1 |       2 |      70 |

|       1 |       3 |      50 |

|       2 |       1 |     100 |

|       2 |       2 |      80 |

+---------+---------+---------+

5 rows in set (0.00 sec)

 

정상규(pajama)님이 2012-08-29 14:38:59에 작성한 댓글입니다.

 간만에 MySQL 놀러왔습니다. ㅋ

 

 

SELECT AVG(column3) FROM table ORDER BY column1, column2 LIMIT 1, 5;

 

아닐런지요..

우욱님이 2012-08-29 15:06:47에 작성한 댓글입니다. Edit

정상규 / 관심 감사드립니다..

그렇게 하게 되면
 select * from tab1 where column1=1 and column2 >=1 union all

 select * from tab1 where column1=3 and column2 <=2;
인경우는 column1 값이 2인 것은 나오지 않아서.. 

 

1~3이거든요 범위가 중간에 2도 포함되게 

 col1, col2   col1, col2
(1,         2) ~ (3,        2)
안에 포함된 목록

김인수님이 2012-08-29 15:18:44에 작성한 댓글입니다. Edit

if( ( column1 >= 1 && column2 >= 1 ) && (  column1 <= 2 && column2 <= 2 )

제시해주신 위 문장은 모두 AND 연산이므로 아래와 동치입니다.

if( column1 >= 1 && column1 <=2 && column2>=1 && column2 <=2 )

즉, column1의 값이 1~2 사이인 것들 중, column2의 값이 1~2 사이인 ROW가 선택되는 것입니다.

이 조건문이 왜 column2 = 3인 경우를 포함해야 하는지, 저는 아직 이해가 잘 안됩니다.

 

EXCEL 등의 스프레드 시트에서, (1,1) ~ (2,2)를 영역 지정해보시면 아시겠지만, 당연히 (1,3) 셀은 제외됩니다.

 

원하시는 결과를 정상규님께서 정확하게 찝어주셨는데요, 저렇게 매 column1 값마다 column2 조건을 줘서 UNION ALL 또는 아래와 같이 OR 로 조건문을 연결하시거나,

mysql> SELECT * FROM tab1 WHERE (column1=1 AND column2>=1) OR (column1=2 AND column2 <=2);

만약 column2의 값이 10 미만이라는 전제조건이 있다면, 아래와 같이 하셔도 됩니다.

mysql> SELECT * FROM tab1 WHERE column1*10+column2 BETWEEN 11 AND 22;

 

박현우(lqez)님이 2012-08-29 17:28:58에 작성한 댓글입니다.
이 댓글은 2012-08-29 17:34:47에 마지막으로 수정되었습니다.

글이다 보니 제가 질문을 제대로 하지 못한거 같습니다..예도..

죄송합니다. 

 

실은 저 데이터는 트리 같은 것입니다.

column1이 부모 column2가 자식

1

|--- 1

|--- 2

|--- 3
2
|--- 1

|--- 2
3

|--- 1

|--- 2
|--- 3

|----4

4

|--- 1

...

대략 이런 식인데 각 부모 하위 자식이 가변데이터라서 1번의 자식이 2번보다 많을 수도 있고 

해서 사용자가 범위를 검색을 하는데요 시작부모, 시작부모의 사용자가 선택한 자식 ~ 끝부모의 사용자가 선택한 자식

사이의 목록을 가져와야 하는것인데..

우선은 

start_parent = 1;
start_parent_child = 1;
end_parent = 2;
end_parent_child = 2;
AND ( CONCAT( column1, column2 ) BETWEEN 11 AND 22 )
형식으로 비슷하게 우선은 처리해ㅤㄴㅘㅅ습니다.

추가적인 문제가 없는지는...
 
 
 

모쪼록 혼돈을 드려 죄송하고 신경써 주셔서 감사드립니다. 댓글이 큰 힘이 되네요.

김인수님이 2012-08-29 19:03:54에 작성한 댓글입니다. Edit

부모, 자식이 한자리 숫자로만 구성 되어 있다면

concat으로 하시면 됩니다.

아니시면 앞에 최대 자리수 만큼 0을 포함하게 해서

concat해서 조회 하시면 될 것 같습니다.

박인호(paerae)님이 2012-08-31 15:07:21에 작성한 댓글입니다.

 조건이...AND가 아닌 OR 아닌가요???

김한결(jackal)님이 2012-08-31 15:32:27에 작성한 댓글입니다.

 위와 같이 하니 범위가 10자리가 넘어갈 때는 오류가 있어서 박현우님이

말씀하신것을 참고로 수정 하였습니다.

 

http://sqlfiddle.com/#!2/2bad9/12

김인수님이 2012-09-03 10:08:25에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
30315그룹별 결과 집계 질문드립니다. [1]
최미진
2012-09-02
3130
30314ERROR 1064 구문에러 도와주세요 [1]
최영관
2012-08-30
6899
30313fetch후에 data를 update 하기
포맷
2012-08-29
2907
30312멀티 between 문제 [11]
김인수
2012-08-29
4354
30311필드의 뒷부분만 자르려면어떻게 하죠? php의 explode 기능이 없을까요? [1]
디카프료
2012-08-28
2988
30310버젼 올리고 나서 날짜 깨지는 문제 [2]
김종수
2012-08-24
2966
30309문법 에러 확인 좀 부탁드려요. [2]
이광영
2012-08-23
3545
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2017 DSN, All rights reserved.
작업시간: 0.289초, 이곳 서비스는
	PostgreSQL v9.6.3으로 자료를 관리합니다