2014-04-01 2 views
0

DBMS는 Mysql을 사용하고 있습니다.SQL 쿼리 : join

경로 테이블 : 나는이 테이블이

id idSentence idPath token  isTV idC 
1 s0001  p1  test1  true ic000041 
2 s0001  p1  test2  true ic000041 
3 s0002  p2  test3  true ic000042 
4 s0002  p3  test4  false ic000042 
5 s0002  p3  test5  true ic000042 
6 s0002  p4  test6  false ic000042 
7 s0002  p4  test7  true ic000042 
8 s0002  p4  test8  true ic000042 
9 s0002  p4  test9  false ic000042 
10 s0003  p5  test10  false ic000044 
11 s0003  p5  test11  false ic000044 
12 s0003  p5  test12  false ic000044 
13 s0003  p6  test13  false ic000044 
14 s0003  p6  test14  true ic000044 

관계 테이블 :

id id2 rel 
    3 4  nsubj 
    4 5  dobj 
    6 7  pobj 
    8 9  nsubjpass 
    10 11 pobj 

내용 테이블 :

idC  tag 
    ic000040 a 
    ic000041 p 
    ic000042 div 
    ic000043 b  
    ic000044 i 

내가 각 idSentence에 대한 (쿼리를 만들려면 경로 테이블) 다음 조건을 가진 idSentence, idPath, tokens, isTV, rel 및 tag가있는 각 튜플을 선택합니다.

  • 나는 내가 얻는 경로 테이블에 대해 예를 들어, 2, 3 (사이 idPath의 독특한에만 길이를 선택합니다 isTV
  • 적어도 하나 개의 값이 '사실'을 포함에만 idPath을 선택합니다 다음과 같은 길이 : 1, 3 및 2 다음 쿼리 : select count (distinct (idPath)) cc as idSentence에 의해 경로 그룹에서; 그래서이 경우 나는 단지 3과 2를 얻고 싶다.);
  • 각 idPath의 길이를 2와 3 사이에서 선택하고 싶습니다. (예 : idPath에 의해 경로 그룹에서 cc로 select 쿼리 (*)를 선택하면 다음과 같이 나타납니다 : 2,1,2,4,3, 2 나는 단지 값을 선택합니다 : 2,2,3,2)

나는이 쿼리 생성 :

SELECT p.idSentence, p.idPath, p.token, p.isTV, r.rel, t.tag 
    FROM path p LEFT OUTER JOIN relation r 
     ON (p.id = r.id) JOIN content t ON(p.idC=t.idC) 
    JOIN 
     (select idPath, max(case when p.isTV = 'true' then 1 else 0 end) as HasTv, 
     (case when COUNT(*) between 2 and 3 then 1 else 0 end) as Has 
     from path p 
     group by idPath 
    ) pf 
    on p.idPath = pf.idPath and 
    pf.HasTv = 1 and pf.Has = 1; 

을하지만 조인 조건도 중앙 추가해야합니다 :

 select count(distinct(idPath)) as cc from path group by idSentence 

추가하려면 검색어를 어떻게 수정할 수 있습니까? 조건? 다음 문

select count(*) as cc from path group by idPath 

:

는 이미 조건을 추가 한 QUERY

답변

0

는 수를 확인하려면 : 나는 쿼리를 테스트하고 부분적으로 작동

(case when COUNT(*) between 2 and 3 then 1 else 0 end) as Has 

idSequence로 그룹화해야하는 각 시퀀스의 고유 한 경로가 있으므로 다른 열로 그룹화 된 하위 쿼리에 대해 다른 조인 조건을 지정할 수는 없습니다.

SELECT p.idSentence, p.idPath, p.token, p.isTV, r.rel, t.tag 
FROM path p 
LEFT JOIN relation r ON p.id = r.id 
JOIN content t ON p.idC = t.idC 
JOIN 
(SELECT idPath, 
      MAX(isTV = 'true') AS HasTv, 
      COUNT(*) AS pathLength 
    FROM path 
    GROUP BY idPath 
) pf 
ON p.idPath = pf.idPath 
    AND pf.HasTv = 1 
    AND pathLength BETWEEN 2 AND 3 
JOIN 
(SELECT idSentence, COUNT(DISTINCT(idPath)) AS paths 
    FROM path 
    GROUP BY idSentence 
) ps 
ON p.idSentence = ps.idSentence 
    AND ps.paths BETWEEN 2 AND 3 

확인 Sqlfiddle :

가장 좋은 방법은 다른 가입 조건에 다른 하위 쿼리에 가입하는 것 (I 쿼리의 당신의 부분 읽기 쉽도록 조금 간체).