728x90
728x90
문제
난이도
Level 2
풀이 방법
먼저 부모와 부모의 형질(parent_genotype)을 찾는 쿼리를 짜봤다.
select b.id child, a.id parent, a.genotype parent_genotype
from ecoli_data a, ecoli_data b
where a.id = b.parent_id
위 쿼리를 실행하면 다음과 같은 결과가 나온다.
위를 통해 부모(parent)가 누구인지와 부모의 형질(parent_genotype)을 알아냈으니
이젠 부모의 형질을 포함하는지만 확인하면 된다.
위의 쿼리에서 b는 child 테이블, a는 parent 테이블이다.
따라서 b.genotype이 a.genotype을 포함하는지 확인하는 코드를 작성하면 된다.
이는 비트 연산(AND)을 이용하면 간단하다.
MySQL에서는 AND 비트 연산을 &로 할 수 있다.
X의 비트가 Y의 비트를 포함하는지 확인하려면 X&Y의 결과가 Y와 같아야 한다.
무슨 말이냐면, 10진수 20이 4를 포함하려면 20 & 4 = 4여야 한다.
20 = 10100(2)
4 = 100(2)
이므로 20 & 4 = 100(2) = 4가 되어 20은 4를 포함한다는 것을 알 수 있다.
따라서 자식의 형질이 부모의 형질을 모두 포함하려면
b.genotype & a.genotype의 결과가 a.genotype이어야 한다.
이를 반영한 최종 쿼리는 아래와 같다.
코드
select b.id id, b.genotype genotype, a.genotype parent_genotype
from ecoli_data a, ecoli_data b
where a.id = b.parent_id
and b.genotype & a.genotype = a.genotype
order by b.id
반응형