You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写SQL查询找出所有合著过论文的作者(含Schema)

嘿,我来帮你搞定这个找合著作者的SQL查询!首先得先明确咱们常用的数据库表结构——一般来说会有两张核心表(如果你的表名/字段名不一样,直接替换就行):

找出所有合著过论文的作者对

先明确常见表结构

  • papers:存储论文基本信息,至少包含paper_id(论文唯一标识)字段,通常还会有paper_title(论文标题)、publish_year(发表年份)等字段
  • paper_authors:存储论文与作者的关联关系,包含paper_id和author_id(作者唯一标识)字段;如果没有单独的作者信息表,也可能直接存author_name

基础查询:获取所有合著作者对(无重复)

如果想得到所有一起写过论文的作者组合,且避免重复(比如A-B和B-A只保留一组,同时排除作者自己和自己配对),可以用自连接的方式:

SELECT DISTINCT
  pa1.author_id AS author1_id,
  pa1.author_name AS author1_name,
  pa2.author_id AS author2_id,
  pa2.author_name AS author2_name,
  p.paper_id,
  p.paper_title
FROM paper_authors pa1
JOIN paper_authors pa2 
  ON pa1.paper_id = pa2.paper_id 
  AND pa1.author_id < pa2.author_id -- 核心条件:避免重复配对和自配对
JOIN papers p 
  ON pa1.paper_id = p.paper_id;

关键逻辑解释

  • pa1.author_id < pa2.author_id:这个条件能确保每对作者只出现一次,不会同时输出(A,B)和(B,A),也自动排除了作者自己和自己关联的情况
  • DISTINCT:防止同一对作者因为合著多篇论文而重复出现;如果需要看到每篇论文对应的合著情况,可以去掉这个关键字

进阶需求:统计每对作者的合著次数

要是你还想知道每对作者一起写了多少篇论文,可以用分组统计:

SELECT
  pa1.author_id AS author1_id,
  pa1.author_name AS author1_name,
  pa2.author_id AS author2_id,
  pa2.author_name AS author2_name,
  COUNT(DISTINCT pa1.paper_id) AS co_authored_papers_count
FROM paper_authors pa1
JOIN paper_authors pa2 
  ON pa1.paper_id = pa2.paper_id 
  AND pa1.author_id < pa2.author_id
GROUP BY pa1.author_id, pa1.author_name, pa2.author_id, pa2.author_name
ORDER BY co_authored_papers_count DESC; -- 按合著次数从多到少排序

适配独立作者表的情况

如果你的作者信息存在单独的authors表(存储author_id、author_name、affiliation等详情),只需要多关联一次作者表即可:

SELECT DISTINCT
  a1.author_name AS author1_name,
  a1.affiliation AS author1_affiliation,
  a2.author_name AS author2_name,
  a2.affiliation AS author2_affiliation,
  p.paper_title
FROM paper_authors pa1
JOIN paper_authors pa2 
  ON pa1.paper_id = pa2.paper_id 
  AND pa1.author_id < pa2.author_id
JOIN authors a1 ON pa1.author_id = a1.author_id
JOIN authors a2 ON pa2.author_id = a2.author_id
JOIN papers p ON pa1.paper_id = p.paper_id;

如果需要过滤特定条件(比如只看2020年后发表的论文、排除会议论文等),直接在查询里加WHERE子句就行,比如WHERE p.publish_year >= 2020~

内容的提问来源于stack exchange,提问作者USERSFU

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:03:04