MySQL加入。从一个表到另一个表加入多行?
问题描述:
我有一张名为Articles
的表格。我也有一张表Tags
。标签表实际上具有2个独立的表格,因为它是文章和标签之间的多对多关系。例如:MySQL加入。从一个表到另一个表加入多行?
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;
现在,是有可能做一个查询返回的文章,也都涉及到在同一个查询文章从标签表中的标签?
答
按照意见,您通常使用JOIN
语句来组合多个表中的相关记录。
注意,我认为
-
Articles
有ID
列 -
Article_Tags
有ArticleID
和TagID
列 -
Tags
有ID
列
如果实际列名称不同,您应该将我的声明中的相应列替换为其实际名称。关于JOIN语法
SQL连接被用于从两个或更多表中查询数据
SQL语句
SELECT * FROM Articles a INNER JOIN Article_Tags at ON at.ArticleID = a.ID INNER JOIN Tags t ON t.ID = at.TagID
的更多信息,根据一定的列之间的 关系在这些表中
答
如果您想要取回单个行,则需要使用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
不,它不是作业。我实际上在CodeIgniter论坛上发布了一个问题(我可以链接,如果你需要我的话)与某个项目相关,并且有人建议做一个查询。我在问,因为我不确定是否有可能。 – GV1 2011-12-24 23:35:10
您通常会在table2.table1ID = table1.id内连接table3 ON table3.id = table2.table3id'中执行select * from table1内连接table2。其中'table2'是您的链接表。 – 2011-12-24 23:36:35
我明白了。我需要回顾一下我的连接有没有使用它们一段时间。 – GV1 2011-12-24 23:37:02