2014-01-12 1 views
0

아래 쿼리에서 두 개의 필드 course_namecourse_id이있는 기본 테이블이 있습니다. 나는 그들이 테이블에 나타나는 시간의 양에 의해 상위 3 개의 코스를 질의를 통해 보여 주려고 노력하고 있습니다. 나는 COUNT을 사용하고 있는데, 추가 셋의 값을 비교하여 상위 3 개를 결정하고 결과를 으로 표시합니다. mysql 구문 문제가 발생했습니다. 테이블에 나타나는 시간과 함께 상위 3 개의 코스를 어떻게 표시 할 수 있습니까? FIDDLE여러 번 나타나는 상위 세 항목을 계산하는 쿼리

SELECT course_name, course_id, COUNT(1) AS cnt 
FROM courses 
JOIN (SELECT distinct cnt cnt3 
FROM courses 
ORDER BY cnt DESC 
LIMIT 2, 1) x 
ON cnt >= cnt3 
ORDER by cnt DESC 
GROUP BY course_id 

테이블 스키마 :

CREATE TABLE courses 
(`course_name` varchar(15), `course_id` int) 
; 

INSERT INTO courses 
    (`course_name`, `course_id`) 
VALUES 
    ('Math', 1), 
    ('Science', 2), 
    ('PHYS', 3), 
    ('Study Hall', 4), 
    ('History', 5), 
    ('Social Studies', 6), 
    ('Math', 1), 
    ('PHYS', 3), 
    ('Math', 1), 
    ('Science', 2), 
    ('Science', 2), 
    ('Study Hall', 4), 
    ('History', 5) 
; 

원하는 결과 :

+-------------+-------+ 
| Course_name | Count | 
+-------------+-------+ 
| Math  |  3 | 
| Science  |  3 | 
| PHYS  |  2 | 
| Study  |  2 | 
| History  |  2 | 
+-------------+-------+ 

답변

3

귀하의 구문 오류가이 때문이다

ON cnt >= cnt3 

CNT 별칭이고 당신이 할 수있는 조인에서 사용하지 마십시오. 또한 주문 및 그룹 별 주문 순서가 잘못되었습니다.

편집 쿼리를 보면 여기

시작, 당신은 그것을 overengineered 수 있습니다. 이것은 당신에게 당신의 대답을주지 않을까요?

select course_name, course_id, count(*) records 
from courses 
group by course_name, course_id 
having count(*) > 1 
order by records desc  
limit 3 
+0

당신은 맞다. 나는 내 질문에 과잉 행동했다. 훨씬 간단하고 나은 솔루션. – techAddict82

0
Select course_name,cnt from(
Select course_id,course_name,count(course_id) as cnt group by course_id,course_name 
)tmp 
Order by cnt desc limit 0,3 
관련 문제