MySQL加入。从一个表到另一个表连接多行?

时间:2011-12-24 23:29:45

标签: mysql sql

我有一张名为Articles的表格。我还有Tags的表格。标签表实际上有2个单独的表,因为它是文章和标签之间的多对多关系。例如:

CREATE TABLE Articles (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT
    title VARCHAR(255),
    author INT UNSIGNED NOT NULL,
    body TEXT NOT NULL -- column type may not be representative
) Engine=InnoDB;

CREATE TABLE Tags (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(32)
) Engine=InnoDB;

CREATE TABLE Article_Tags (
    article INT UNSIGNED NOT NULL,
    tag INT UNSIGNED NOT NULL,
    FOREIGN KEY (article) REFERENCES Articles (id),
    FOREIGN KEY (tag) REFERENCES Tags (id)
) Engine=InnoDB;

现在,是否可以执行单个查询以返回文章,以及同一查询中的Tags表中与该文章相关的所有标记?

2 个答案:

答案 0 :(得分:1)

如果您想要只返回一行,则需要使用an aggregate function来组合标记。

假设article(id, title, content)tag(id, name)article_tags(联接表)有(tag_id, article_id),那么就像这应该做到(显然,未经测试):

SELECT a.title,
       a.content,
       GROUP_CONCAT(
        DISTINCT t.name 
        ORDER BY ASC
        SEPARATOR ", "
      ) as tags
FROM article a
INNER JOIN article_tags at ON at.article_id = a.id
INNER JOIN tag t ON t.id = at.tag_id
GROUP BY a.id

答案 1 :(得分:0)

根据评论,您通常使用JOIN语句来组合来自多个表的相关记录。

请注意,我认为

  • Articles有一个ID
  • Article_Tags有一个ArticleIDTagID
  • Tags有一个ID

如果实际列名不同,则应将我的语句中的相应列替换为实际名称。

SQL声明

SELECT *
FROM   Articles a
       INNER JOIN Article_Tags at ON at.ArticleID = a.ID
       INNER JOIN Tags t ON t.ID = at.TagID

有关JOIN语法

的更多信息
  

SQL连接用于根据a查询来自两个或多个表的数据   这些表中某些列之间的关系