2016-06-29 3 views
1

여러 테이블 (3 또는 4)을 조인하고 예상대로 결과를 얻는 쿼리가 있습니다. 그래서 기본적으로 내가 처음에이 두 번째 쿼리의 결과를 포함하지 할하위 쿼리에서 모든 EXCEPT 결과를 선택하십시오.

SELECT test_id, COUNT(*) AS theCount FROM tests 
    JOIN test_questions ON test_id= tq_test_id 
    WHERE type= 'THE_TYPE' 
    GROUP BY test_id 
    HAVING theCount = 1 

:

SELECT DISTINCT test_title, stt_id FROM student_tests 
LEFT JOIN student_test_answers ON sta_stt_num = stt_id 
JOIN tests ON stt_test_id = test_id 
WHERE student_test_answer_id IS NULL 

내가 다른 데이터 세트를 보여줍니다 다른 쿼리를 가지고, 그것은 기본적으로 이것이다. test_id는 결합 필드가됩니다.

나는 존재하지 않는 곳 (위의 쿼리 -)을 시도했지만 올바르지 않은 결과는 반환하지 않습니다. 나는 또한 '안에()'시도했다

더 좋은 방법이 있나요? 이 같은

+0

실제 검색어를 보지 않고 하위 쿼리가 상관되지 않았다고 추측합니다. – mustaccio

+0

실제 검색어, 데이터 샘플 및 예상 결과를 알려주십시오. 귀하의 설명이 명확하지 않고 쿼리가 명확하지 않습니다 :'test_id = tq_test_id' - 해당 열이 어떤 테이블에 속해 있는지 알 수 없습니다 – Alex

+1

정확히 어떻게 NOT IN()을 시도 했습니까? 이 쿼리를 하위 쿼리로 사용하려면 결과 집합에 theCount가 필요하지 않습니다. – Philipp

답변

3

시도 뭔가 :

(SELECT test_id, COUNT(*) AS theCount FROM tests 
JOIN test_questions ON test_id= tq_test_id 
WHERE type= 'THE_TYPE' 
GROUP BY test_id 
HAVING theCount = 1) outer 
LEFT JOIN (
     [OtherQuery] 
) a ON outer.test_id = a.test_id 
WHERE a.test_id IS NULL 
+0

나는 이것이 내가 필요한 것이라고 확신한다. – KickingLettuce

+0

나는 그의 쿼리가 반환하는 것을 모른다. 그러나 그것의 구조는 작동하는 것처럼 보인다. 위의 다른 사람들도 똑같이했을 것 같습니다.물론이 질문을 "LEFT JOIN (ANSWER)"라고 주 쿼리에 추가했습니다. 위 부분은 내가 필요한 부분 일뿐입니다. – KickingLettuce

+0

@Alex Sarcasm 맞나요? 나는 다른 사람들이 그것에 더 많은 시간을두고 포맷하는 것처럼 보였다고 말할 것이다. 그러나 나는 나를 위해 일한 해답을 고를 것이라고 생각합니다. 커뮤니티는 내가 찾은 모든 것 중 가장 좋은 것을 상향 조정할 것입니다. – KickingLettuce

0

정확하게 두 번째 쿼리는 무엇입니까? 여기에는 하나의 쿼리 만 표시되며 하위 쿼리는 표시되지 않습니다. 또한, 정확한 스키마의 sqlfiddle 도움이 될 것입니다.

아무튼, 나는 당신이 조인을 제외하고 일종의 왼쪽을 원한다고 생각합니다.

select  test.test_id, count(*) as theCount 
from  tests test 
join  test_questions tq 
on   tq.test_id = test.test_id 
left join tests excluded_test 
on   excluded_test.test_id = test.test_id 
where  tq.type = 'THE_TYPE' 
and  << Some condition that explains what excluded_test is >> 
and  excluded_test.test_id is null 

편집 : 그것은이 같은 모습 예, (수선 된 어떤 방법으로했다) 원래의 질문에서 누락 된 세부 사항의 많은 확실히있다, 그리고 아직 어떤 누락되었습니다. 예를 들어 전체 테이블 구조를 아는 것이 중요하므로 여기에 대한 구체적인 대답을하기가 어렵습니다. 주석에 기록 된대로

1

당신은 이런 식으로 일을 할 수 있어야한다 :

SELECT 
    DISTINCT test_title, 
    olc_stt_i_num 
FROM 
    student_tests 
LEFT JOIN 
    student_test_answers 
     ON olc_sta_i_stt_num = olc_stt_i_num 
INNER JOIN 
    ol_class_tests 
     ON stt_test_num = test_num 
WHERE 
    student_test_answer_id IS NULL 

    -- added this: replace test_id with real column 
    AND ***test_id*** NOT IN (
     SELECT 
     test_id 
     FROM 
     tests  
     JOIN 
     test_questions 
      ON test_id= tq_test_id  
     WHERE 
     type= 'THE_TYPE'  
     GROUP BY 
     test_id  
     HAVING 
     COUNT(*) = 1 
    ) 
+1

나는 궁금하다.'test_id' 컬럼이'student_tests' 또는'student_test_answers' 또는'ol_class_tests'에 있다는 것을 아십니까? 나는 그것을 어디 선가 놓쳤는가? – Alex

+0

아니요, 실제 ID를 가진 실제 열의 자리 표시 자일뿐입니다. OP는 하위 쿼리 선택시 카운트 (*)만으로 쿼리가 망가 졌음을 암시합니다. – Philipp

1

여기 내 대답이다. 왼쪽 외부 조인은 참가자 (테스트)를 제공합니다. test_questions에 일치 항목이 없으면 여전히 테스트 행을 반환하지만 test_questions에 대해서는 null을 반환합니다. 따라서 null 인 test_question.test_id를 찾으면 찾고있는 것을 얻을 수 있습니다.

나는 카운트 절에 대해서도 특정하고 카운트 (*)를하지 않기 때문에 mysql이 실제로 카운트하려고하는 것을 확실히 알 수 있습니다.

create database test; 
use test; 

create table test 
(
    test_id int, 
    `the_type` varchar(20) 
); 

create table test_questions 
(
    test_question_id int, 
    test_id int, 
    `the_type` varchar(20) 
); 

insert into test values (1, 'history'); 
insert into test values (2, 'chemistry'); 
insert into test values (3, 'reading'); 

insert into test_questions values (1, 1, 'hard question'); 
insert into test_questions values (2, 1, 'medium question'); 
insert into test_questions values (3, 2, 'hard question'); 
insert into test_questions values (4, 2, 'easy question'); 

select * from test; 
select * from test_questions; 

select t.test_id, count(distinct t.test_id) 
from test t 
left outer join test_questions tq on tq.test_id = t.test_id 
where 
    tq.test_id is null 
group by 
    t.test_id 
관련 문제