如何编写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
相关产品推荐
相关产品推荐

