关于sql语句连表查询的一个问题

用户bPtcBD
  • 550

建了三张表一张 表示文章post:

clipboard.png

一张表 表示标签tag

clipboard.png

一张关系表p_t:

clipboard.png

我想做一个文章发布系统,每个文章可以有多个标签,比方说我发布了一篇文章,这篇文章的标签可以有 php nodejs python。

然后我想实现这样一个web api接口:前端请求这个接口我返回所有文章的信息,返回数据格式如下:

[
    {
        "id":"1",
        "title":"xxx",
        "content":"xxx",
        "tag":["python","java"]
    },
    {
        "id":"2",
        "title":"xxx",
        "content":"xxx",
        "tag":["php","java"]
    },
    {
        "id":"3",
        "title":"xxx",
        "content":"xxx",
        "tag":["php","python","java"]
    }
]

这个sql语句该怎么写呢?或者这个查询该如何做呢?

回复
阅读 1.8k
2 个回答
用户bPtcBD
  • 550
✓ 已被采纳

使用 GROUP_CONCAT 函数

https://blog.csdn.net/xb12369...

可以这样来查询

select p2.id, p2.title,p2.content,
group_concat(name) as tags
from p_t p1,post p2,tag t1 where p1.post_id= p2.id and t1.id = p1.tag_id 
GROUP BY id

查询结果为:

clipboard.png

资料引用

你好,这种场景不建议在数据库层面做join,依据你最终拿到的字段来看,可以接受的返回结果为:
1.

article_id,tag_name
article_id,tag_name

这样数据存在冗余.
2.

article_id,(tag_name,tag_name)

后面进行一个字符串的拼接,在数据库进行不定数量的字符串拼接不好.

因此我的建议是:
首先执行select * from post where id = xxx拿到文章信息.
然后select tag_id from p_t where post_id = xxx拿到所有标签的id.

然后执行select * from tag where id in (xxx,xxx)拿到所以tag信息.然后在应用程序中进行组装结果.这样子性能以及可读性都会好一些.

当然如果有特殊情况,可以在数据库层面做:

select id,title,content,name
from 
(select * from post join p_t on post.id = p_t.post_id) as a left join tag on a.tag_id = tag.id
where a.post_id = xxx 
宣传栏