하나라도 가지고 있는, 전체를 가지고 있는 검색 쿼리 질문드립니다. 0 6 1,973

by Kun [MySQL] mysql [2023.03.23 14:09:36]


안녕하세요. 현재 쿼리를 작성하고 있다가 도저히 생각이 나질 않아 조언을 얻고자 글을 남깁니다..

 

props 테이블 [userId, name] 을 가지고 있습니다.(name은 속성명입니다.)

 

userId name
1 A
1 B
2 B
3 A
3 B
3 C
4 A

 

만약 위와 같은 데이터가 있다고 가정할 경우 

name을 검색하기 위해 ["A","B"]의 데이터를 받았습니다.

1. 하나라도 포함된 내용을 찾기 위해서는 아래와 같은 쿼리를 날렸을 경우 userId 1,2,3,4를 찾을 수 있었습니다.

select userId from props where name in ("A","B") group by userId;

2. 모두를 가지는 내용을 찾기 위해서는 어떻게 쿼리를 처리해야할지를 모르겠습니다.

만약 위와 같이 A,B를 찾는다면 검색 결과는 userId 1,3 두명이 나와야합니다.

 

팁만이라도 주시면 감사합니다!

by 신이만든지기 [2023.03.23 14:17:44]
with tmp(userid, name) as (
    select 1, 'A' union all
    select 1, 'B' union all
    select 2, 'B' union all
    select 3, 'A' union all
    select 3, 'B' union all
    select 3, 'C' union all
    select 4, 'A'
)
select userid
  from tmp
 where name in ('A', 'B')
 group by userid
having count(*) = 2
;

 


by Kun [2023.03.23 14:19:46]

답변 감사합니다! 혹시 카운트를 체크하게 되면 속도가 거의 2배가 느려지는데 다른 방법은 없을까요..?


by 신이만든지기 [2023.03.23 14:36:16]
with tmp(userid, name) as (
    select 1, 'A' union all
    select 1, 'B' union all
    select 2, 'B' union all
    select 3, 'A' union all
    select 3, 'B' union all
    select 3, 'C' union all
    select 4, 'A'
)
select userid
  from (
        select userid, count(1) as cnt
          from tmp
         where name in ('A', 'B')
         group by userid) t
where cnt = 2;

똑같은 쿼리인데요.

(name, userid )로 인덱스가 없다면 만드는 것도 한 방법인 것 같습니다.

 


by Kun [2023.03.23 14:40:48]

감사합니다 인덱스 생성해서 해보겠습니다!


by 우리집아찌 [2023.03.23 15:05:54]

userId, name 중복은 없나요?


by Kun [2023.03.23 15:25:23]

네 중복은 없습니다!

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