2011-12-26 55 views
0

这只是我的标签系统中使用的表格设计的一个例子。多对多的关系,使查询更简单

ARTICLES 
id 
content 

TAGS 
id 
tag 

TAGSTOARTICLES 
articleid 
tagid 

@edit最后一些rubberducking后,我设法写出下列查询:


只是选择的文章:

SELECT a.id, a.content, GROUP_CONCAT(t.tag) AS tags 
FROM articles a 
LEFT JOIN tagstoarticles tta ON tta.articleid = a.id 
LEFT JOIN tags t ON t.id = tta.tagid 
GROUP BY a.id 

结果:

id content   GROUP_CONCAT(t.tag) 
1 Lorem ipsum 1 tag1,tag2 
2 Lorem ipsum 2 tag1 
3 Lorem ipsum 3 tag2 

搜索标签:

SELECT a.id, a.content, GROUP_CONCAT(t.tag) AS tags 
FROM articles a 
LEFT JOIN tagstoarticles tta ON tta.articleid = a.id 
LEFT JOIN tags t ON t.id = tta.tagid 
WHERE a.id IN (SELECT A.id FROM tagstoarticles M, articles A, tags T 
       WHERE M.tagid = T.id 
       AND (T.tag IN ('tag1')) 
       AND A.id = M.articleid 
       GROUP BY A.id 
       HAVING COUNT(A.id)=1 
) 
GROUP BY a.id 

结果:

id content   GROUP_CONCAT(t.tag) 
1 Lorem ipsum 1 tag1,tag2 
2 Lorem ipsum 2 tag1 

但用于搜索标签查询是一个烂摊子,任何想法解决这个更轻松?

回答

1

“但是,如何修改此查询以同时选择分配给本文的所有标签?”

SELECT tag FROM tags INNER JOIN tagstoarticles ON tags.id = tagstoarticles.tagid WHERE articleid=[your article's id] 

“以及如何在没有标签搜索的情况下获得结果?

SELECT articles.id, tags.tag FROM articles INNER JOIN tagstoarticles ON tagstoarticles.articleid = articles.id INNER JOIN tags ON tagstoarticles.tagid = tags.id ORDER BY articles.id, articles.date 

这给你一个不同的结果行每个标签,所以你必须申请一个位后处理的将其转换成带有标签的文章列表。但是,通过文章ID进行排序,可以确保一篇文章的所有标签一起返回。

+0

我想简单地显示按日期排序的文章。但是我想显示这篇文章的所有标签列表。 @edit我不知道我是否理解这个权利,但你的查询必须单独执行,有没有任何选项可以同时做到这一点? – boreq 2011-12-26 13:11:31