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

多表关联查询:如何用单SQL获取指定文章的全量关联数据

问题

需要从4张关联表(articles、authors、article_categories、category)中获取ID为1的文章全量详情,该文章关联了多个分类,但执行指定SQL时,仅得到单条分类相关数据(实际原SQL会返回多行,每行对应一个分类,文章与作者信息重复),如何通过单条SQL获取该文章的全量详情?

示例表结构与数据

表articles

idcontentauthor_id
1content is here3

表authors

idauthor_name
3Simon

表article_categories

article_idcategory_id
11
12
13

表category

idcategory_name
1foo
2bar
3bla

尝试的SQL语句

SELECT *
FROM articles 
    JOIN authors ON authors.id = articles.author_id 
    JOIN article_categories ON article_categories.article_id = articles.id 
    JOIN category ON category.id = article_categories.category_id
WHERE articles.id = 1;

解决方案

你的原SQL其实会返回3条结果,每条对应文章的一个分类,只是文章内容、作者信息会在每行重复显示。可根据需求选择以下两种方式获取全量详情:

方式1:保留所有分类的完整关联数据(多行)

原SQL本身已能获取全量分类数据,仅结果以多行形式呈现,每行对应一个分类。若需明确指定返回字段,可优化为:

SELECT 
    a.id AS article_id,
    a.content,
    au.author_name,
    c.category_name
FROM articles a
JOIN authors au ON au.id = a.author_id
JOIN article_categories ac ON ac.article_id = a.id
JOIN category c ON c.id = ac.category_id
WHERE a.id = 1;

执行后返回3行数据,完整包含文章的所有分类信息。

方式2:将多个分类合并为单个字段(单行)

若希望将文章的所有分类合并为一个字段(如逗号分隔),可使用聚合函数结合字符串拼接函数,不同数据库语法略有差异:

MySQL/MariaDB

SELECT 
    a.id AS article_id,
    a.content,
    au.author_name,
    GROUP_CONCAT(c.category_name SEPARATOR ', ') AS category_names
FROM articles a
JOIN authors au ON au.id = a.author_id
JOIN article_categories ac ON ac.article_id = a.id
JOIN category c ON c.id = ac.category_id
WHERE a.id = 1
GROUP BY a.id, a.content, au.author_name;

PostgreSQL

SELECT 
    a.id AS article_id,
    a.content,
    au.author_name,
    STRING_AGG(c.category_name, ', ') AS category_names
FROM articles a
JOIN authors au ON au.id = a.author_id
JOIN article_categories ac ON ac.article_id = a.id
JOIN category c ON c.id = ac.category_id
WHERE a.id = 1
GROUP BY a.id, a.content, au.author_name;

SQL Server

SELECT 
    a.id AS article_id,
    a.content,
    au.author_name,
    STRING_AGG(c.category_name, ', ') WITHIN GROUP (ORDER BY c.category_name) AS category_names
FROM articles a
JOIN authors au ON au.id = a.author_id
JOIN article_categories ac ON ac.article_id = a.id
JOIN category c ON c.id = ac.category_id
WHERE a.id = 1
GROUP BY a.id, a.content, au.author_name;

执行后返回1行数据,category_names字段会包含所有分类名称(例如foo, bar, bla)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 05:18:20