두 조건을 모두 만족하는 컬럼 가져오기 0 4 544

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 입니다.

https://www.db-fiddle.com/f/j4JmvDkHYrHH7wAfgExCLn/3

by 우주민 [2022.02.18 17:17:24]

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로 변경했습니다.


by 식민최 [2022.02.18 17:43:17]

감사합니다


by 식민최 [2022.02.18 17:43:28]
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;

 

자답 입니다


by 마농 [2022.02.21 10:08:15]
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'
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입