首页 > 解决方案 > 涉及在列中查找最频繁元组值的 SQL 查询

问题描述

我有以下关系:

我试图将以下内容表达为 SQL 查询:

找到教过最多课程的讲师的 ID 和姓名(即在教中拥有最多的元组)。

我的查询

select ID, name 
from teaches 
  natural join instructor
group by ID
order by count(*) desc

我知道这是不正确的,但我觉得我在正确的轨道上。为了回答这个问题,您需要处理这两种关系,因此需要自然连接操作。由于该问题询问教授最多课程的讲师,这告诉我我们正在尝试计算每个讲师 ID 出现在教员关系中的次数。据我了解,我们希望计算不同的讲师 ID,因此需要按命令分组。

标签: sqljoin

解决方案


不要使用自然连接:它们所做的只是依靠列名来决定哪些列与表相关(它们不会检查外键约束或类似的东西,正如您所想的那样)。这在本质上是不可靠的。

您可以使用常规inner join

select i.id, i.name 
from teaches t
inner join instructor i on i.id = t.sec_id
group by i.id, i.name
order by count(*) desc
limit 1

笔记:

  • 这假设该列teaches.sec_idinstructor.id(我看不出可以使用哪个其他列)

  • limit在查询中添加了一个子句,因为您声明您想要顶级讲师 - 语法可能因数据库而异

  • 始终在列名前加上它们所属的表,以使查询明确且更易于理解

  • 在聚合查询中,子句中列出的所有非聚合列select都应出现在group by子句中,这是一种很好的做法(也是许多数据库的要求);group by我在您的条款中添加了讲师姓名


推荐阅读