2011-12-23 4 views
1

記事(id、title、content)、タグ(id、tag)、tags2all(id、iditem、idタグ、モジュール)の3つのテーブルがあります。私は特定のタグを持つすべての記事を選択したいが、結果のリストでは、各記事のタグも表示できるようにしたい。合理的にうまく機能しているようだ1つのMySQLクエリでタグとすべての記事のタグを持つすべての記事を選択するにはどうすればよいですか?

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を追加すると、正しい記事が選択されますが、タグリストにはそのタグのみが含まれます。

答えて

1

を試してみましょう:

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"); 
を:ここで

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とデータです

0

私はよく分からないけどさんは、これが私のために正常に動作するように見えた

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 
関連する問題