2016-08-08 1 views
0

퍼지 제목에 대해 유감; 누군가가 더 나은 대안을 가지고 있다면 나는 그것을 바꿀 것이다!쿼리 관계 1에서 여러 개의 whe를 통해 1 - 많은 관계

프로젝트와 메타 데이터가있는 두 개의 테이블 하나가 있습니다. 프로젝트에 도달 한 이정표가있는 프로젝트입니다. 프로젝트는 여러 가지 이정표를 가질 수 있습니다.

projects: id | title | ..... 
milestones: id | type | project_id | ... 

x- 유형의 중요 시점을 가진 프로젝트를 모두 검색하는 것은 매우 간단합니다. 또는 각 프로젝트에서 마지막 마일스톤을 검색하십시오.

하지만 지금 당장 가지고있는 문제는 주어진 일정의 이정표를 가진 모든 프로젝트 (ID)를 제공하는 쿼리를 작성하는 것입니다.

그래서 : 중요한 유형 -A AND 유형 -d와 유형 -x를 갖는 모든 프로젝트를 반환하십시오. 마일스톤 수가 가변적 인 곳; 하지만 항상> = 1

누구나 제안?

+0

는 GROUP BY, HAVING COUNT (DISTINCT 이정표) 등 – jarlh

답변

0

가정 projects.id 프로젝트에 PK, 사용 그룹에 의해 당신이 모든 3 가지를 원한다면, 당신은 별개의 milestones.type (감사를 계산한다

select p.id, count(*) milestones 
    from projects p join milestones m on p.id = m.project_id 
where m.type in ('A','D','X') 
group by p.id 
having count(*) >= 1 

가진 COUNT (*)입니다 @jarlh) :

select p.id, count(*) milestones 
    from projects p join milestones m on p.id = m.project_id 
where m.type in ('A','D','X') 
group by p.id 
having count(distinct m.type) = 3 
+1

나는 영업 이익은 여기에 A, D 및 X의 모든 기대 가정합니다. 수 (별개의 p.type) = 3'을 가진'로 변경합니다. – jarlh

+0

@jarlh 좋은 점! – vercelli

0

이 시도 :

SELECT distinct * 
FROM projects 
JOIN milestones ON projects.id = milestones.project_id 
WHERE milestones.type in ('a', 'd', 'x') 

DISTINCT가 중복 PROJ을 차단합니다 ects (여러 마일스톤 포함). JOIN를 사용하여 당신은 당신이 어떤과 함께 프로젝트를 얻을 수 있도록 (> = 1) 적용 이정표.