题解与优化!

某乎问答回答过教育类问题的用户里有多少用户回答过职场类问题

http://www.nowcoder.com/practice/b02cf9ee7b9f4cdda308f8155ff3415d

题意

给你一张题目信息表,一个回答情况表,请你查询出其中回答过教育类问题的用户中,回答过职场问题的用户数量

思路:

  • 因为在统计前,我们需要对用户回答过的问题类型进行限制,而这个限制本身又有个条件(即在回答过教育类的用户中去查询)
  • 因此我们首先应该为这个限制,获取对应的记录,因此我们需要先查询出所有回答过教育类问题的用户,SQL如下

SQL1:

SELECT
	t2.author_id
FROM
	issue_tb AS t1
INNER JOIN answer_tb AS t2 ON t1.issue_id = t2.issue_id
WHERE t1.issue_type = 'Education'
  • 将该查询结果作为条件之一,再统计用户数量即可,SQL如下
SELECT
    COUNT(DISTINCT t2.author_id) AS 'num'
FROM
    issue_tb AS t1
INNER JOIN answer_tb AS t2 ON t1.issue_id = t2.issue_id
WHERE t2.author_id IN (
    SQL1
    )
AND t1.issue_type = 'Career';

   

优化

  • 按照惯例查看执行计划,因为没有索引,所以全为全表扫描
  • 此时开销为21.38 alt alt

   

分析:

  • 对于没有任何索引的表(其实还是有隐藏列的),我们可以利用《阿里巴巴Java开发手册》中对索引的约束,对两表连接的字段添加索引
  • 所以我们对两表的issue_id添加索引,再为answer_tb中的author_id字段添加索引
  • 为什么不为issue_type建立索引呢?首先,这个字段在表中的区分度并不高,就算加上,也作用不大,甚至会起反作用(各位可以去试试)
  • 优化后,我们再次查看开销,降为了13.50 alt alt
MySQL练习 文章被收录于专栏

解析牛客网中的SQL题目

全部评论

相关推荐

05-20 13:59
门头沟学院 Java
米黑子米黑子:你这个成绩不争取下保研?
点赞 评论 收藏
分享
自学java狠狠赚一...:骗你点star的,港卵公司,记得把star收回去
点赞 评论 收藏
分享
评论
10
收藏
分享

创作者周榜

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