从数据库获取文章以及连接标记的最佳方法

时间:2012-10-29 12:02:03

标签: mysql sql

我想从MySQL数据库中获取他们所连接的文章和所有标记名称。我的SQL代码:

CREATE TABLE articles (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (id)
)

CREATE TABLE tags (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    name VARCHAR(25) NOT NULL,
    PRIMARY KEY (id)
)

CREATE TABLE connections (
    art_id INT UNSIGNED NOT NULL,
    tag_id INT UNSIGNED NOT NULL
);

我应该执行多个查询还是制作单个查询?我怎么能做到这一点?我试着玩JOIN,但似乎不能这样做。

PS。我一直在寻找,但在SO上没有任何确切的问题。

4 个答案:

答案 0 :(得分:1)

select a.id, group_concat(t.name) as tags
from articles a
left join connections c on c.art_id = a.id
left join tag t on t.id = c.tag_id
group by a.id

此查询每篇文章返回1行,group_concat()会将所有连接标记的名称返回为comma delimited list(如果没有连接标记,则返回null)。

答案 1 :(得分:1)

你有一个良好的开端 - 但有一些事情可以在这里进行优化。

我们还假设你的文章表有一个ID和一个标题字段(只是为这个查询添加一些香料)。

简单回答您的问题:

Select a.ID "ID", a."Title" "Title", t.Name "Tag_Name"
From connections c
     Left Join article a 
     on a.id = c.art_id
     Left Join tags t 
     on t.id = c.tag_id
-- If you want to filter on a certain article ID 
WHERE a.id = @SomeArticleParam

我真的建议一些事情来优化这些表:

  1. 由于连接直接链接文章和标签,我会将外键引用添加到连接表。这是一个很好的链接:foreign key link
  2. 索引您的连接表 - 这将允许在引用特定标签或文章时更快的查询。唯一索引将有助于防止在连接表中添加重复的文章/标记对。这是一个很好的链接,可以帮助您入门:index link

答案 2 :(得分:0)

试试这个

  select a.(*),t.name from articles a
  inner join connection c on a.id=c.art_id
  inner join tags t on c.tag_id=t.id

答案 3 :(得分:0)

 SELECT articles.*,tags.* FROM articles , tags,connections 
 where tags.id=connections.tag_id  and articles.id=connections.art_id