2014-01-12 25 views
0

在下面的查询中,我有一个包含两个字段course_namecourse_id的基本表。我试图通过查询显示前三个课程的表格数量。我正在使用COUNT,然后比较附加选择中的值以确定前三位,最后通过GROUP by course_id显示结果。我得到一个MySQL语法问题。我怎样才能显示排名前三的课程的次数? 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是一个别名,你可以在连接中不使用它。此外,您的订单和订单子句的顺序是错误的。

编辑从这里开始

看你的查询,你可能已经过度设计的。这不会给你你的答案吗?

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