首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用一个MySQL查询选择所有带有标签的文章和所有文章的标签?

问如何使用一个MySQL查询选择所有带有标签的文章和所有文章的标签?
EN

Stack Overflow用户
提问于 2011-12-23 15:42:05
回答 2查看 860关注 0票数 1

我有3个表:文章(id,标题,内容),标签(id,标签)和模块(id,iditem,idtag,tags2all )。我希望选择具有特定标签的所有文章,但在结果列表中,我还希望能够显示每篇文章的标签。

目前,我正在使用这个查询来显示文章列表:

代码语言:javascript
复制
SELECT GROUP_CONCAT(t.tag SEPARATOR ', ') AS tags,a.* FROM articles AS a LEFT JOIN tags2all AS ta ON ta.iditem=a.id AND ta.module='articles' JOIN tags AS t ON ta.idtag=t.id GROUP BY a.id HAVING a.title IS NOT NULL

它似乎工作得相当好,但我似乎不知道应该向查询添加什么内容,以便只显示具有特定标签的文章。

如果我添加WHERE t.id=3,它会选择正确的文章,但标记列表将只包含该标记。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-23 15:58:26

这对我来说似乎没什么问题:

代码语言:javascript
复制
select a.*
from
(
SELECT GROUP_CONCAT(t.tag SEPARATOR ', ') AS tags,a.id,a.title,a.content
FROM articles AS a LEFT JOIN tags2all AS ta ON ta.iditem=a.id 
AND ta.module='articles' JOIN tags AS t ON ta.idtag=t.id 
GROUP BY a.id HAVING a.title IS NOT NULL
) a inner join tags2all t2a on t2a.iditem = a.id
inner join tags t on t.id = t2a.idtag
where t.id = 3;

下面是我使用的DDL和数据:

代码语言:javascript
复制
create table articles (id int unsigned not null primary key, title varchar(50), content varchar(50));

create table tags (id int unsigned not null primary key, tag varchar(50));

create table tags2all (id int unsigned not null primary key, iditem int unsigned not null, idtag int unsigned not null, module varchar(50));

insert into articles values (1,"Article1","Some content");
insert into articles values (2,"Article2","Some content");
insert into articles values (3,"Article3","Some content");

insert into tags values (1,"Tag1");
insert into tags values (2,"Tag2");
insert into tags values (3,"Tag3");
insert into tags values (4,"Tag4");
insert into tags values (5,"Tag5");
insert into tags values (6,"Tag6");
insert into tags values (7,"Tag7");

insert into tags2all (id,iditem,idtag,module) values (1,1,1,"articles");
insert into tags2all (id,iditem,idtag,module) values (2,1,2,"articles");
insert into tags2all (id,iditem,idtag,module) values (3,1,3,"articles");
insert into tags2all (id,iditem,idtag,module) values (4,2,3,"articles");
insert into tags2all (id,iditem,idtag,module) values (5,2,4,"articles");
insert into tags2all (id,iditem,idtag,module) values (6,2,5,"articles");
insert into tags2all (id,iditem,idtag,module) values (7,3,3,"articles");
insert into tags2all (id,iditem,idtag,module) values (8,3,4,"articles");
insert into tags2all (id,iditem,idtag,module) values (9,3,7,"articles");
票数 1
EN

Stack Overflow用户

发布于 2011-12-23 15:48:52

我不确定,但让我们试一下

代码语言:javascript
复制
SELECT GROUP_CONCAT(t.tag SEPARATOR ', ') AS tags,a.* FROM articles AS a 
LEFT JOIN tags2all AS ta ON ta.iditem=a.id AND ta.module='articles' 
JOIN tags AS t ON ta.idtag=t.id 
JOIN tags AS t1 ON ta1.idtag=t.id
GROUP BY a.id HAVING a.title IS NOT NULL
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8613451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档