728x90
반응형
row 행 group 데이터 and 조건
우리가 흔히
SQL 에서 사용되는 WHERE의 조건은
'한 줄'
그러니까 1row, 1행을 뽑기 위한 조건을 의미한다.
아래와 같은 데이터가 있다고 가정했을때.
WHERE 조건으로
id = 4 AND name = '사과' AND type = '빨간색'
이라는 조건을 주어야
4번줄 하나를 검색할 수 있다.
또는
type='음식' 이라는 조건이라면
'음식'에 해당되는 한 줄, 한 줄이 모여
하나의 list 로 결과를 조회한다.
그렇다면,
type 값이 음식 이면서 노란색인 name 값 하나를 얻고 싶을 때 어떻게 해야할까..?
SELECT * fROM T_TEST WHERE type IN ('음식', '노란색');
이렇게 조회한다면 결과가 아래와 같이 나올 것이다.
또는,
SELECT * fROM T_TEST WHERE type = '음식' AND type = '노란색';
이런 쿼리를 날리면 결과가 뭐가 나올까?
결과는 당연히 없음이 나온다.
저 바나나만을 위한 결과만 나오면 어떻게 group by를 하든 바나나를 추출하고 싶은건데;
어떻게 할 수 있을까.
SELECT name, GROUP_CONCAT(type) fROM T_TEST group by name;
일단 이렇게 그룹별 데이터를 한 컬럼 안으로 몰아주었다.
그리고,
여기서 AND 조건을 주면 된다.
단, 'FIND_IN_SET' 이라는 친구를 사용하였다.
이 친구는 한 컬럼 내에 ',' 로 구분된 데이터를 구분하여 위치를 찾아주는 친구이다.
이를 활용하여 아래과 같은 쿼리를 만들 수 있다.
SELECT name fROM (
SELECT
name,
GROUP_CONCAT(type) AS type
fROM T_TEST group by name
) A WHERE FIND_IN_SET('노란색', A.type) > 0 AND FIND_IN_SET('과일', A.type) > 0;
'노란색' 이고 '과일'인 데이터인
바나나만을 추출 할 수 있다.
아래 전체 쿼리를 사용해서 확인해보시길!
CREATE TABLE T_TEST (
id int(4) NOT NULL AUTO_INCREMENT,
name varchar(200) ,
type varchar(255) ,
created_at datetime default now(),
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='테스트';
INSERT INTO T_TEST (name, type) VALUES ('바나나', '과일');
INSERT INTO T_TEST (name, type) VALUES ('바나나', '음식');
INSERT INTO T_TEST (name, type) VALUES ('바나나', '노란색');
INSERT INTO T_TEST (name, type) VALUES ('사과', '빨간색');
INSERT INTO T_TEST (name, type) VALUES ('사과', '음식');
INSERT INTO T_TEST (name, type) VALUES ('사과', '과일');
INSERT INTO T_TEST (name, type) VALUES ('아이폰12', '검은색');
INSERT INTO T_TEST (name, type) VALUES ('아이폰12', '고체');
INSERT INTO T_TEST (name, type) VALUES ('아이폰12', '모바일');
SELECT * fROM T_TEST;
SELECT name fROM (
SELECT
name,
GROUP_CONCAT(type) AS type
fROM T_TEST group by name
) A WHERE FIND_IN_SET('노란색', A.type) > 0 AND FIND_IN_SET('과일', A.type) > 0;
더 좋은 방법이 있거나
다른 방법
문제가 될 요인이 있다면 댓글로 알려주세요!
반응형
'Development' 카테고리의 다른 글
구글 플레이 스토어 출시 준비 및 비공개 테스터 20명 대응 및 프로덕션 신청 과정 (1) | 2024.01.22 |
---|