2009-09-10 8 views
0

다음과 같은 스키마/데이터/출력이 주어지면 출력 결과를 얻기 위해 SQL 쿼리를 어떻게 포맷합니까? 테이블 보고서를 만들MySQL SQL 하위 쿼리?

(
ID BIGINT AUTO_INCREMENT,
이름 VARCHAR (255) NOT NULL UNIQUE,
소스 VARCHAR (255) NOT NULL UNIQUE,
PRIMARY KEY (ID)
) ENGINE = INNODB; TABLE 필드 CREATE

ENGINE = INNODB (
ID BIGINT AUTO _ INCREMENT,
이름 VARCHAR (255) NOT NULL UNIQUE,
는 BIGINT,
PRIMARY KEY (ID)
를 REPORT_ID);

ALTER TABLE filed 추가 외래 키 (report_id) REFERENCES 보고서 (id) ON DELETE CASCADE;

리포트 :
ID, 이름, 소스
1 보고서 1의 소스 1
2 report2 SOURCE2
3 REPORT3 source3
4 report4

필드 source4 :
ID, 이름 REPORT_ID
1 FIRSTNAME 3
성 2
3 세 3
,4 주 4
5 4 세
6 랭크 4

예상 검색어 "연령 등급"
REPORT_ID, REPORT_NAME위한 출력 num_fields_matched
3 REPORT3 1
4 report4 2

미리 감사드립니다!

+0

Btw입니다. "name"열이 UNIQUE 일 때 어떻게 두 개의 "Age"값을 "Field"테이블에 넣을 수 있습니까? –

+0

그건 내 실수 였어. 나는 내 자신보다 앞서있다. 코드를 테스트 할 때 스키마를 편집하여 몇 가지 고유 한 문을 제거해야했습니다. 다시 한번 감사드립니다. –

답변

0

이 쿼리는 필요한 단어가있는 모든 보고서를 반환합니다.

SELECT * 
FROM report r 
INNER JOIN field f ON r.id = f.report_id 
WHERE name IN ('age','rank') 

중첩해야합니다. 따라서 최종 검색어는

SELECT a.id, a.name, COUNT(*) 
FROM 
(
    SELECT r.id, r.name 
    FROM report r 
    INNER JOIN field f ON r.id = f.report_id 
    WHERE f.name 
    IN ('age', 'rank') 
)a 
GROUP BY a.id, a.name