我有一张名为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表中与该文章相关的所有标记?
答案 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
有一个ArticleID
和TagID
列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查询来自两个或多个表的数据 这些表中某些列之间的关系