2012-10-08 2 views
1

복잡한 내용입니까? (나를 위해 최소한). 나는 "티켓"이라는 테이블을 가지고 있는데, "id"컬럼은 고유 키입니다. "레이블"이라고하는 다른 테이블이 있습니다. 고유 한 키가 없습니다 (보이는 것에서). "티켓"에는 티켓 정보 (메시지, 티켓을 만든 사람 등)가 저장됩니다. 티켓을 만들 때 레이블을 추가하여 해당 레이블이있는 티켓을 검색 할 수 있습니다. 예 : "나중에 검토".MySQL은 역으로 반환합니까? 검색 결과 또는 결과가 포함되지 않았 음

내가하려는 것은 역방향 쿼리입니다. 예를 들어 특정 레이블이없는 모든 티켓을 보여주세요. "나중에 리뷰"가있는 티켓을 보여주지 마십시오. 티켓에 라벨이없는 경우 라벨 표에 아무 것도 없습니다. 필자가 직접 작성하거나 쿼리 작성 도구를 사용하여 작성하는 쿼리 유형은 얻을 수 없습니다.

내 이미지에서 Tickets.id가 174를 가지고 있으며, Labels.ticket_id 174에 2 x 레이블이 설정되어있는 것을 볼 수 있습니다.

는 상관없이 가입 어떤 쿼리,하지, 내가 다시 어떤 결과를 얻을 수없는 하나 또는 몇 가지 이상한 이유로, 난 여전히 게재 표 (174)를 얻을 시도하지 등을하지 않습니다.

여기 제가 시도한 가장 간단한 쿼리입니다. 그러나 Ive는 지금까지 약 30 번의 반복을 간단한 것부터 매우 복잡한 것으로 시도했습니다.

나에게 "MyLabel"또는 나던은이 라벨이 나던 티켓의 모든 tickets.id보기 :이라는 한 Statment를 구축하는 일을하거나 어떤 방법을 생각 wouldnt가 왜

SELECT tickets.id 
    FROM 
     tickets, labels_tickets 
    WHERE 
     tickets.id <> labels_tickets.ticket_id 
    GROUP BY 
     tickets.id 

은 누구나 제안 할 수 있습니다 값을 레이블 테이블에 입력하십시오.

감사합니다.

답변

1
SELECT tickets.id 
    FROM 
     tickets 
    WHERE 
     tickets.id NOT IN (SELECT ticket_id from labels_tickets where labels_tickets.label = 'out of hours' or labels_tickets.label = null) 
    GROUP BY 
     tickets.id 

시도해 보겠습니다.

+0

아픈 너무 줘! 고마워요.이게 지금 몇 시간 동안 너를 괴롭 히고있어! – Will

+0

'labels_tickes.ticket_id'에'NULL' 값이 포함되어 있으면 잘못된 결과를 반환합니다. 이것이 가능하다면'ticket_id가 null이 아닌 곳'을 하위 선택에 추가해야합니다. –

+0

이것이 작동하는 것 같습니다. 필자는 위의 쿼리를 내 레이블과 null 값 중 하나를 반영하도록 변경했습니다. 많은 감사합니다. – Will

0

outer join을 입력하고 ticket_id이없는 티켓 만 labels_tickets 테이블에서 선택할 수 있습니다.

SELECT t.id 
FROM tickets t 
LEFT OUTER JOIN labels_tickets l ON t.id = l.ticket_id 
WHERE l.ticket_id IS NULL 
GROUP BY t.id 
HAVING sum(l.label = 'review later') = 0 

this JOIN examples

+0

내가보기에 .. 그것의 모습 .. 그게 효과가있어! 그리고 왼쪽 외부 조인을 시도하고 null도 검색했습니다! 임 몇 가지 테스트를 실행하려고하고 나는 모든 것이 잘되면 답변으로 받아 들일 것입니다! 고맙습니다! – Will

+0

닫기입니다! "레이블"테이블에 나열되지 않은 모든 티켓을 반환하지만 레이블 데이터베이스 내에서 키워드를 필터링하는 옵션을 제공하지 않습니다. 예 : "review later". 이제는 AND 또는 OR 또는 그와 같은 것을 추가하는 방법을 생각하고 있습니까? – Will

+0

내 업데이트를 사용해주세요. –

0

다음은 ReviewLater 라벨이없는 모든 티켓을 얻을 참조 :

SELECT lt.ticket_id 
FROM labels_tickets 
group by lt.ticket_id 
having sum(case when label = 'ReviewLater' then 1 else 0 end) = 0 

이 그룹으로 모든 레이블을 처리합니다. 합계는 원하는 레이블이있는 번호를 계산합니다. 이 개수가 0 인자를 원하게됩니다.

그런 멤버십 유형 쿼리에는 group byhaving을 사용하는 것이 좋습니다. 그것은 태그의 유무에 대한 임의의 조합으로 쉽게 일반화되었습니다.

+0

Abu의 대답을 처리 할 수 ​​있도록 관리했습니다. 당신의 도움에 많은 감사드립니다! – Will

관련 문제