by 식민최 [2022.02.18 16:48:29]
**Schema (MySQL v5.7)**
create table TEST
(
parent varchar(100),
child varchar(100),
`order` int
)
---
select * from TEST;
| parent | child | order |
| ------ | --------- | ----- |
| A | APPLE | 1 |
| A | BANANA | 2 |
| A | TOMATO | 3 |
| B | APPLE | 1 |
| B | BANANA | 2 |
| B | PINEAPPLE | 3 |
| C | BANANA | 1 |
| C | APPLE | 2 |
| C | MELON | 3 |
| D | APPLE | 1 |
| D | PINEAPPLE | 2 |
| D | PEAR | 3 |
| E | APPLE | 1 |
| E | MELON | 2 |
| E | PEAR | 3 |
---
위 처럼 TEST 테이블이 있습니다.
order 컬럼 값이 1, child 값이 APPLE
order 컬럼 값이 2, child 값이 BANANA
위 두 조건을 모두 만족하는 parent 를 가져오고, order 값이 3인 child를 가져오려고 합니다.
즉, order 1, 2가 모두 APPLE, BANANA 인 A, B 를 가져오고
그 중 order 값이 3인 TOMATO 와 PINEAPPLE 이 리턴되야 합니다.
--- | child | | --------- | | TOMATO | | PINEAPPLE | ---
도움 주시면 감사하겠습니다 !
관련 dbfiddle 입니다.
WITH IN_DATA AS ( -- 조건 정의 영역 SELECT 'APPLE' AS child , 1 AS order_T UNION ALL SELECT 'BANANA' AS child , 2 AS order_T ) , SUB_Q AS ( -- 필요 PARENT 도출 영역 select T1.parent from TEST T1 INNER JOIN IN_DATA T2 ON T1.child = T2.child AND T1.order_T = T2.order_T GROUP BY parent HAVING COUNT(1) = (SELECT COUNT(1) FROM IN_DATA) ) SELECT T1.child FROM TEST T1 INNER JOIN SUB_Q T2 ON T1.parent = T2.parent WHERE T1.order_T = 3 ;
이게 원하는 결과인지는 잘 모르겠지만....
임의로 ORDER 컬럼을 ORDER_T로 변경했습니다.
감사합니다
SELECT child
FROM TEST
WHERE parent IN
(SELECT parent
FROM TEST
GROUP BY parent
HAVING SUM(IF(`order` = 1 AND child = 'APPLE', 1, 0)) > 0
AND SUM(IF(`order` = 2 AND child = 'BANANA', 1, 0)) > 0)
AND `order` = 3;
자답 입니다
SELECT MIN(IF(`order` = 3, child, null)) child FROM test GROUP BY parent HAVING MIN(IF(`order` = 1, child, null)) = 'APPLE' AND MIN(IF(`order` = 2, child, null)) = 'BANANA' ;