Development

[MYSQL] row 행 group 데이터의 and 조건 데이터 조회

Jun Mr 2021. 8. 2. 23:15
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;

 

더 좋은 방법이 있거나

다른 방법

문제가 될 요인이 있다면 댓글로 알려주세요!

반응형