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

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

http://www.nowcoder.com/practice/203d0aed8928429a8978185d9a03babc

法一:

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;

知识点是UNION后的排序问题,ORDER BY子句只能在最后一次使用。 如果想要在UNION之前分别单独排序,那么需要这样:

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

法二:用tid字段的左边第一个数来排序。

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

UNION 

SELECT question_id AS tid, COUNT(DISTINCT practice_record.uid) uv,
COUNT(*) pv FROM practice_record 
GROUP BY question_id
 
ORDER BY LEFT(tid,1) DESC, uv DESC, pv DESC;
全部评论
方法二里刚刚好头部序号不同可以排而已,假如question编号是A001 或者多来几个类型就g了
1 回复 分享
发布于 2023-03-31 15:13 浙江
为什么要加select * from()t1结果排序才正常呢?萌新求问。
1 回复 分享
发布于 2021-12-21 12:17
union all之前不能有order by,我把两个表又套了一个select
点赞 回复 分享
发布于 2022-09-06 12:11 上海
方法二,不是已经按照不同表分别查询了吗,为什么计算UV时还要加上表名作为前缀? SELECT exam_id AS tid, COUNT(DISTINCT exam_record.uid) uv, COUNT(*) pv FROM exam_record GROUP BY exam_id
点赞 回复 分享
发布于 2022-08-18 17:31 广东
我想问一下left(tid,1) desc 究竟做了什么?
点赞 回复 分享
发布于 2022-06-20 10:10
这样做就是想要绕过机制先排序在结合。
点赞 回复 分享
发布于 2022-06-20 10:09
他说了是在union连接语句中order by只能在最后一次查询连接结果集中使用。
点赞 回复 分享
发布于 2022-06-20 10:08

相关推荐

03-10 22:53
吉林大学 golang
点赞 评论 收藏
分享
评论
102
13
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务