2016-06-10 4 views
1

일부 문제가 발생합니다. 문제는 해커와 챌린지라는 두 개의 테이블을 가지고 있습니다. 나는 hacker_id, 이름을 인쇄 할 쿼리를 작성하는 것을 시도하고있다MySQL : 지정된 조건에 따라 일부 결과를 제외하려면

Hackers(hacker_id: int, name string) 
Challenges(challenge_id: int, hacker_id int) 

, 각 학생이 만든 문제의 총 수 : 다음은 스키마입니다. 도전 과제의 총 수를 내림차순으로 정렬하십시오. 두 명 이상의 학생이 같은 수의 도전 과제를 만든 경우 hacker_id로 결과를 정렬합니다. 둘 이상의 학생이 동일한 수의 도전 과제를 생성하고 그 횟수가 생성 된 도전 과제의 최대 수보다 적 으면 결과에서 해당 학생을 제외시킵니다.

select hackers.hacker_id , 
     hackers.name , 
     count(challenges.challenge_id) as challenges_created 
     from 
     hackers left join challenges 
     on 
     hackers.hacker_id = challenges.hacker_id 
     having 
     count(challenges_created) >= max(challenges_created) 
     order by challenges_created desc, hackers.hacker_id asc 

내가 잘못 출력을 얻고있다 :

여기 내 쿼리입니다! 내가 잘못되고있는 곳을 말해주세요!

샘플 입력 :

해커 테이블 : image 도전자 테이블 : image

Sample Output: 
21283 Angela 6 
88255 Patrick 5 
96196 Lisa 1 
+0

'> = max'는별로 의미가 없습니다. 정의에 따르면 max()는 집합에서 가장 큰 값을 반환하므로 다른 값이이 값보다 큰 값일 수는 없습니다. –

+0

그래서 2보다 크지 만 최대 값보다 작은 항목 (질문의 마지막 줄)을 제외하려면 –

+1

적어도 일관된 문장을 만드십시오. Sort * your * results ... : 학생 운동. 해커 표 : – DenisGL

답변

0

이것은 진짜 대답이 아니라 당신을위한 시작점 :

http://sqlfiddle.com/#!9/6910c/5

SELECT h.hacker_id , 
     h.name , 
     COUNT(challenges.challenge_id) as challenges_created 
FROM hackers h 
LEFT JOIN challenges 
ON h.hacker_id = challenges.hacker_id 
GROUP BY h.hacker_id 
#HAVING challenges_created >= max(challenges_created) 
ORDER BY challenges_created desc, h.hacker_id asc 

달성하려는 내용을 이해할 수 없기 때문에 HAVING 절을 주석 처리했습니다.

왜 결과가 3 행 밖에 없습니까? 왜 RoseFrank을 결과 집합에서 제외해야합니까?

+0

그 것이 문제입니다. 그들은 동일한 수의 challenge_created를 가지며 최대 값보다 작은 수 있습니다. –

0

mysql에서만 해결해야 할 미친 요구 사항입니다. CTE (MySQL이 지원되지 않음) 사용하면 쿼리를 다시 사용할 수 있습니다 : 당신이 하나 개의 쿼리에서 여러 번 사용할 수 있기 때문에 당신도, 임시 테이블을 사용할 수 없습니다 MySQL의에서

with tmp as (
    select h.hacker_id, h.name, count(1) as challenges_created 
    from hackers h 
    left join challenges c on c.hacker_id = h.hacker_id 
    group by h.hacker_id, h.name 
    order by challenges_created desc, h.hacker_id asc 
), max_challenges_created as (
    select max(challenges_created) as challenges_created 
    from tmp 
), count_per_challenges_created as (
    select challenges_created, count(1) as c 
    from tmp 
    group by challenges_created 
) 
select * 
from tmp 
cross join max_challenges_created m 
left join count_per_challenges_created c on c.challenges_created = tmp.challenges_created 
where tmp.challenges_created = m.challenges_created 
    or c.c = 1 

http://rextester.com/XGYQ11641

. 그래서 당신은 &이 같은 쿼리를 세 번 붙여 복사해야 (와 MySQL이 한 번만 캐시를 사용하여 실행할 수 있기를 바랍니다) : 여러 필요한 조인을 사용할 때

select * 
from (
    select h.*, count(1) as challenges_created 
    from hackers h 
    left join challenges c on c.hacker_id = h.hacker_id 
    group by h.hacker_id 
    order by challenges_created desc, h.hacker_id 
) tmp 
cross join (
    select max(challenges_created) as challenges_created 
    from (
     select h.*, count(1) as challenges_created 
     from hackers h 
     left join challenges c on c.hacker_id = h.hacker_id 
     group by h.hacker_id 
     order by challenges_created desc, h.hacker_id asc 
    ) tmp 
) m 
left join (
    select challenges_created, count(1) as c 
    from (
     select h.*, count(1) as challenges_created 
     from hackers h 
     left join challenges c on c.hacker_id = h.hacker_id 
     group by h.hacker_id 
     order by challenges_created desc, h.hacker_id asc 
    ) tmp 
    group by challenges_created 
) c on c.challenges_created = tmp.challenges_created 
where tmp.challenges_created = m.challenges_created 
    or c.c = 1 

http://rextester.com/IDUMRB49795

0

해결책은 간단합니다 테이블. 파생 된 결과를 명확하게 나타 내기 위해 그룹화하는 것이 좋지만 파생 된 테이블이 없으면 결과를 그룹화하는 것이 좋습니다.

select hckid, nme 
from 
(select h.name as nme, h.hacker_id as hckid, cnt 
from (select s.hacker_id as hackerid, count(d.score) as cnt 
from submissions s 
join challenges c 
on c.challenge_id = s.challenge_id 
join difficulty d 
on c.difficulty_level = d.difficulty_level 
where d.score = s.score 
group by s.hacker_id 
having count(d.score) > 1) ft 
join hackers h 
on ft.hackerid = h.hacker_id) t 
order by t.cnt desc, t.hckid asc 
관련 문제