查询计算多次出现的前三项

时间:2014-01-12 17:24:39

标签: mysql sql

在下面的查询中,我有一个包含两个字段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 |
+-------------+-------+

2 个答案:

答案 0 :(得分:3)

您的语法错误是由于:

ON cnt >= cnt3

cnt是别名,您不能在连接中使用它。此外,您的order by和group by子句的顺序错误。

编辑从此处开始

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

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

答案 1 :(得分: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