-1

我想从 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

4 回答 4

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()将以逗号分隔列表的形式返回所有连接标签的名称(如果没有连接标签,则返回 null)。

于 2012-10-29T12:04:45.810 回答
1

您有了一个良好的开端 - 但这里有一些可以优化的地方。

我们还假设您的 Article 表有一个 ID 和一个 Title 字段(只是为了给这个查询添加一些趣味)。

简单回答你的问题:

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. 由于连接直接链接文章和标签,我会在连接表中添加外键引用。这是一个很好的链接:外键链接
  2. 索引您的连接表 - 这将在引用特定标签或文章时允许更快的查询。唯一索引将有助于防止在连接表中添加重复的文章/标签对。这是一个很好的链接,可以帮助您入门:索引链接
于 2012-10-29T12:18:03.543 回答
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
于 2012-10-29T12:04:44.920 回答
0
 SELECT articles.*,tags.* FROM articles , tags,connections 
 where tags.id=connections.tag_id  and articles.id=connections.art_id 
于 2012-10-29T12:07:05.937 回答