2013-08-02 3 views
2

SQL에 익숙하지 않지만 일반적으로 기본 쿼리를 구조화 할 수는 있지만 너무 복잡해서 해결할 수 없습니다.이 두 SQL 문을 결합하는 방법

저는 각각 개별적으로 필요한 결과를 제공하는 두 가지 쿼리를 사용합니다. 그러나 필요한 최종 결과를 얻으려면 이들을 결합해야합니다.

특정 검색어의 경우 특정 학생의 모든 "점수"를 획득하고 평균을 반환합니다. 다른 쿼리에서는 테이블에서 가장 높은 레코드와 가장 낮은 레코드를 제거합니다.

이러한 쿼리를 결합하여 가장 높은 점수와 가장 낮은 점수를 먼저 제거한 다음 나머지 점수 만 평균 점수를 반환하고 싶습니다. 올바른 구문을 사용하도록 안내해주세요.

내 쿼리 :

SELECT * 
FROM `scores` 
WHERE `tot_score` = (
SELECT MAX(`tot_score`) 
FROM `scores`) 
OR `tot_score` = (
SELECT MIN(`tot_score`) 
FROM `scores`) 

이 평균 점수 반환 :

SELECT `pres_id`, COUNT(`pres_id`) , ROUND(AVG(`tot_score`) , 2) , `username`, `name`, `pres_day` 
FROM `scores`, `users` 
WHERE `users.id_user` = `scores.pres_id` 
GROUP BY `pres_id` 

가 어떻게 결합 할 수 있습니다를


이 모두 최고 점수와 최저 점수를 반환 이것들은 내가 필요한 결과를 얻기 위해서인가?

+0

결합하여 어떤 샘플 데이터와 원하는 결과를 얻을 수 있습니까? –

답변

5

난 당신이 최소의 계산을 할 것을 제안 단일 부속 조회의 최대 값. 그럼 당신은 단순히 당신이 필터링 할 where 절을 사용하여 원하는 행을 수행 할 수 있습니다 당신이 각 학생에 대한 최고 및 최저 점수를 제거 할 것을 추측하고

SELECT s.`pres_id`, COUNT(`pres_id`), ROUND(AVG(`tot_score`) , 2) , 
     `username`, `name`, `pres_day` 
FROM `scores` s join 
    `users` u 
    on u.id_user = s.pres_id join 
    (select s.pres_id, max(tot_score) as maxts, min(tot_score) as mints 
     from scores s 
     group by s.pres_id 
    ) ssum 
    on u.id_user = ssum.pres_id 
where s.tot_score > ssum.mints and s.tot_score < ssum.maxts 
GROUP BY s.`pres_id`; 

.

SELECT s.`pres_id`, COUNT(`pres_id`), ROUND(AVG(`tot_score`) , 2) , 
     `username`, `name`, `pres_day` 
FROM `scores` s join 
    `users` u 
    on u.id_user = s.pres_id cross join 
    (select max(tot_score) as maxts, min(tot_score) as mints 
     from scores s 
    ) ssum 
where s.tot_score > ssum.mints and s.tot_score < ssum.maxts 
GROUP BY s.`pres_id`; 

편집 :

학생에 대해 하나 개의 점수가있는 경우 수정이 점수를 유지하는

:

그냥 가장 높은 및 가장 낮은 모든 학생들을 생략 할 경우, 다음을 사용
SELECT s.`pres_id`, COUNT(`pres_id`), ROUND(AVG(`tot_score`) , 2) , 
     `username`, `name`, `pres_day` 
FROM `scores` s join 
    `users` u 
    on u.id_user = s.pres_id join 
    (select s.pres_id, max(tot_score) as maxts, min(tot_score) as mints, 
      count(*) as cnt 
     from scores s 
     group by s.pres_id 
    ) ssum 
    on u.id_user = ssum.pres_id 
where (s.tot_score > ssum.mints and s.tot_score < ssum.maxts) or (cnt = 1) 
GROUP BY s.`pres_id`; 
+0

안녕하세요, 고든, 답장을 보내 주셔서 감사합니다. 구문에 오류가 있음을 알았습니다 (크로스 조인에 대한 백틱). 쿼리는 오류없이 실행되었고 처음에는 원하는 결과를 반환하는 것처럼 보였습니다. 그러나 원하는 결과를 얻을 수 있는지 확인하기 위해 몇 가지 레코드를 확인해야합니다 ... – ace300

+0

예, 맞습니다. 각 학생 점수에서 최대 및 최소 점수 (각 인스턴스)를 제거하고 각 학생의 남은 결과 평균을 반환하고 싶습니다. 첫 번째 쿼리를 실행하려고하면 "# 1052 - 필드 목록의 열 'pres_id'가 모호한 오류입니다." – ace300

+0

@user1734104. . . 별칭을 사용하여 어떤 테이블이 왔는지 지정해야했습니다. –

3

당신은 반전 높은/낮은 점수를 쿼리 할 수 ​​다음 기존 평균 쿼리 결과 세트로 사용한다 :

SELECT `pres_id`, COUNT(`pres_id`) , ROUND(AVG(`tot_score`) , 2) , `username`, `name`, `pres_day` 
FROM (
    SELECT `tot_score` 
    FROM `scores` 
    WHERE `tot_score` <> (
    SELECT MAX(`tot_score`) 
    FROM `scores`) 
    OR `tot_score` <> (
    SELECT MIN(`tot_score`) 
    FROM `scores`) 
) AS `scores`, `users` 
WHERE `users.id_user` = `scores.pres_id` 
GROUP BY `pres_id` 
+0

제안 해 주셔서 감사합니다. 쿼리를 실행했지만 '필드 목록'에 # 1054 - 알 수없는 열 'pres_id'를 반환합니다. SELECT를 'scores.pres_id'로 변경하려고했지만 여전히 "알 수없는 열"과 같은 오류를 반환합니다. 어떤 아이디어? – ace300

+0

@ user1734104 인 경우 내부 쿼리를 변경하여 추가 필드를 선택하십시오. –

관련 문제