MySQL에서 SET type 활용하기

게시일 : 2018년 04월 05일    
# MySQL # SET # FIND_IN_SET

SET type은 정해진 리스트 내에서 중복되지 않는 여러 값을 가질 수 있는 string object이다.

SET type은 최대 64개의 Member를 가질 수 있다. 여러 값을 표현할 때는 string 안에 , 를 활용하여 구분짓는다.(띄어쓰기 X)

간단한 예로, SET(‘one’, ‘two’)의 경우, ‘’ / ‘one’ / ‘two’ / ‘one,two’(‘two,one’) 값을 가질 수 있다.

SET type의 주요한 특징 Binary(Decimal) Value

SET type은 하나의 값마다 순서대로 Binary Value가 부여된다.

1bit가 왼쪽으로 계속 움직이면서 Decimal value는 2배씩 증가한다.

Member Decimal Binary
’’ 0 0000
‘one’ 1 0001
‘two’ 2 0010

실습을 위한 students 테이블을 생성해보았다.

CREATE TABLE students (id int not null auto_increment primary key, 
    name VARCHAR(10) not null, 
    interests SET('swimming','drawing','cooking','dancing','videogaming'));
INSERT INTO students(name, interests) VALUES ('August','drawing,cooking');

interests 컬럼에 swimming, drawing, cooking, dancing, videogaming 요소를 포함한 SET을 설정하였다.

Member Decimal Binary
‘swimming’ 1 00001
‘drawing’ 2 00010
‘cooking’ 4 00100
‘dancing’ 8 01000
‘videogaming’ 16 10000

Multiple value는 각 Member의 합으로 계산된다.

id name interests   Decimal로 표현
1 August drawing,cooking   2+4= 6
2 Kevin     0
3 David swimming,dancing,videogaming   1+8+16= 25
4 James cooking,videogaming   4+16= 20
5 Dennis cooking,dancing,videogaming   4+8+16 = 28
6 Buddy videogaming   16

하나의 Member를 찾는 방법

SELECT * FROM students WHERE interests LIKE '%drawing%';
SELECT * FROM students WHERE FIND_IN_SET('drawing',interests) > 0;
# 비트연산 활용 (자기 자신 Decimal 값)
SELECT * FROM students WHERE interests & 2(or 0010);

FIND_IN_SET은,

일치하는 Member가 존재하면 SET에 정의한 순서값 아니면 0을 return한다.

0보다 큰 값으로 조건을 걸면 해당 Member가 존재함을 파악할 수 있다.

 SELECT FIND_IN_SET('cooking',interests) FROM students;
 => cooking은 SET에서 3번째로 정의한 값이므로 3,0,0,3,3,0 이 출력된다.

Multiple member를 찾는 방법

AND를 활용해 중복으로 각각의 Member를 선택해야 한다.

참고 : LIKE와 interest=’Member1,Member2’와 같은 방법은 실제 value의 순서가 다를 경우 못 찾을 수 있는 경우가 생긴다.

SELECT * FROM students WHERE FIND_IN_SET('cooking',interests) > 0 
    and FIND_IN_SET('videogaming', interests);
SELECT * FROM students WHERE interests & 4(or 0100) and interests & 16(or 10000);
id name interests
4 James cooking,videogaming
5 Dennis cooking,dancing,videogaming

References :