2012-10-06 1 views
1

솔직히 말해서이 질문은 숙제입니다.하지만 시간을 낭비했습니다. 잘못된 숫자의 결과 또는 잘못된 데이터를 반환합니다.SQLite A OR B에 속한 사람

적어도 5 회 이상 동영상을 연출하거나 연기 한 사람과 그들이 한 행동의 횟수에 관련된 모든 사람을 선택해야합니다.

movie_idpersonperson_id 및 (pidname)와 movie_idperson_id, directsacts 테이블있다. 내가 함께 왔어요 무엇

입니다 : 기본적으로

SELECT p.name,count(d.mid)+count(a.mid) 
    FROM person p 
    INNER JOIN acts a 
    ON a.pid=p.pid 

    LEFT JOIN directs d 
    ON p.pid=d.pid 

    group by p.pid,p.name 

    having (count(d.mid) +count(a.mid))>=5 

, 나는 person에 가입하기 위해 노력하고있어 및 directs을 위해 같은 일을하는 동안 directs 테이블은 두 테이블에서 person_id 일치. 문제는 두 번째 쿼리의 결과가 포함되어 있지 않다는 것입니다. (10 개의 영화가있는 Alfred Hitchcock이 처음부터 나를 괴롭혔습니다.)

저는 sqlite를 사용하고 있습니다. 누군가가 올바른 방향으로 푸시를 줄 수 있다면 매우 행복 할 것입니다. 나는 집계 된 서브 쿼리를 피하도록 지시 받았다. 나는 그들을 사용하는 해결책이 있었지만 실행하는데 15 분이 걸렸다.

+0

'UNION'에 대해 알고 있습니까? –

+0

나는 모든 감독이 연출 및/또는 연기에 관여했기 때문에 디렉션 d의 UNION SELECT d.pid, d.mid로 시도했다. 그러나, 두 번째 조인 바꾸기, 나는 그런 열을 a.mid 오류가 발생합니다. –

답변

2

이 질문의 목적 상, 배우와 감독 간에는 관련성이 없으며 두 사람 모두 관련자입니다.

그래서의 참여 사람이 두 개의 테이블에 저장되어 있다는 사실을 숨 깁니다 create a view을 보자

CREATE VIEW involved AS 
SELECT mid, pid, 'actor' AS role FROM acts 
UNION ALL 
SELECT mid, pid, 'director' AS role FROM directs 

문제는 다음 person에 참여 간단한 해결 될 수 있습니다. 합니다 (role 열이 실제로 필요하지 않습니다.)


참고 : 질문은 어떤 사람이 같은 영화의 두 배우와 감독이다 경우 발생하는 상태하지 않습니다. role 입력란을 생략하고 UNION ALL 대신 UNION을 사용하는 경우 이는 하나의 참여로 계산됩니다. 그러나 그것을 2로 간주하면 나를 더 잘 이해할 수 있습니다.


다른 메모 : 데이터베이스 구조가 잘못 설계되었습니다. 참여는 처음에 단일 테이블에 저장되어 있어야합니다. 그러나 실생활에서는 항상 데이터베이스 구조를 변경할 수있는 사치가있는 것은 아닙니다. (보기조차도 허용되지 않을 수도 있습니다.이 경우 임시보기를 사용하거나 하위보기로보기를 써야합니다.)

+0

덕분에, 나는 하위 쿼리로 다시 작성하고 나에게 최종 결과를주는 사람에 합류했습니다. 더 중요한 것은 내가 무엇이 잘못되었는지, 작동 방식/작동 방식을 실제로 알고 있다는 것입니다. –