• 面试遇到的一条看上去简单的 SQL 题目,小白求大家指点

    05/26 一笑奈何~ 29 评论

今天面试一直聊得顺利,然后面试官就出了一道 SQL 题目让我当场写语句。题目是这样的:

有这样两个表: name 和 hobby

name 表有两个字段, ID 和 Name ,代表用户的 ID 和名字,ID 唯一

hobby 表有两个字段, ID 和 Hobby ,代表用户的 ID 和兴趣,每个用户都会有许多兴趣

如图所示:

现在要求列出兴趣数量大于等于 3 个的用户的 Name 。

我是这么写的:

面试官认为这样写不对,而且应该用效率更高的写法。小白求大家指点一下,这道题大概有几种写法?哪种写法的效率是最高的。

 

======================================================

另一种写法,用 MySQL explain 后发现效率比上面那种还要低:

1 1 收藏


直接登录
最新评论
  • 男人泪 程序猿 05/26

    要按照名字分组啊

  • HengShuang 程序猿 05/26

    先查Hobby表 查出大于数量3的ID,再查Name

    这样可以减少查询name表的rows

  • 男人泪 程序猿 05/26

    不对啊,我忘了hobby的id就是用户id了,这样写没问题啊

  • 男人泪 程序猿 05/26

    是group by的问题,带有group by的查询列要么是分组中的列要么是聚合函数,
    SELECT
    max(`name`.`Name`) name
    FROM
    `name`
    INNER JOIN hobby ON `name`.ID = hobby.ID
    GROUP BY
    hobby.ID
    HAVING
    count(hobby.Hobby) >= 3
    这样就没有问题了

  • 一笑奈何~   05/28

    有大神提供了另外一种写法:

    请教一下各位大神这种写法比我正文上写法的效率更高吗?

  • nicoke   06/02

     

  • qzm   06/03

    select n.id,n.name,h.hobby from name n, hobby h where n.id = h.id group by id having count(h.hobby) > 3

  • 不知道这种效率如何

    select `name` from `name` where `id` in (select `id` from `hobby` group by `id` having count(`hobby`) > 3)

  • 阿九 php 06/04

    select  Name  from  name where Name.Id in (select hobby.Id ,count(hobby.Id) as num from hobby where num > 2);

  • 你这是因为连接查询导致效率低吧

  • 乌托邦 java开发 06/07

    SELECT b.Name FROM hobby a
    WHERE COUNT(a.Hobby)>=3 GROUP BY a.Hobby
    LEFT JOIN NAME b ON a.id = b.id

  • Tjagerva   06/07

    oracle:select name from name where id in(select id from hobby having count(hobby)>=3 group by id)

    • 一笑奈何~   06/08

      为啥要强调 Oracle ,你这种跟楼上的 http://group.jobbole.com/30870/#comment-86768 不是一模一样吗?

  • bluemoon1999 测试工程师 07/25

    select name.name from name where id in (
    select id from hobby group by id having count(hobby) >3 )

    感觉这个性能还可以。再优化,就很细致了。。懒得想。