题解 | #每个题目和每份试卷被作答的人数和次数#

# union合并
select exam_id AS tid, COUNT(distinct uid) AS uv,
COUNT(start_time) AS pv
FROM exam_record
GROUP BY exam_id

union
select question_id AS tid, COUNT(distinct uid) AS uv,
COUNT(submit_time) AS pv
FROM practice_record
GROUP BY question_id
ORDER BY LEFT(tid,1) DESC, uv DESC, pv DESC


对union 后的排序问题,ORDER BY 只能在最后面使用一次

方法一:观察可得,exam_id是以9开头的,question_id 是8开头的,可以对最左边的数进行排序

方法二:在UNION之前分别单独排序,但是要对查询结果进行命名

SELECT * FROM
( SELECT * FROM t1  ORDER BY 字段 ) newt1 ## 一定要对表重新命名,否则报错 
UNION
SELECT * FROM
( SELECT * FROM t2  ORDER BY 字段 ) newt2


SELECT * FROM
(SELECT exam_id AS tid, COUNT(DISTINCT exam_record.uid) uv,
COUNT(*) pv FROM exam_record 
GROUP BY exam_id
ORDER BY uv DESC, pv DESC) t1

UNION 

SELECT * FROM
(SELECT question_id AS tid, COUNT(DISTINCT practice_record.uid) uv,
COUNT(*) pv FROM practice_record 
GROUP BY question_id
ORDER BY uv DESC, pv DESC) t2;

如果题目没有要求按照uv,pv进行排序,那么union合并后的结果是按照合并顺序来排序的,哪个在union前面就先展示哪一个,在本题中先展示exam_id
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务