这个问题延伸了我刚才问的一个问题,在这里得到了解决:https://stackoverflow.com/posts/62861992/edit
但有必要提出一个新问题,因为另一个问题中缺少一个细节。但首先要做的事。
我有四个模型: articles
, authors
以及 tags
. 每篇文章可以有许多作者,也可以有许多标签。
因此,我的数据库将有以下表格:
article
article_author
author
article_tag
tags
在mysql中:
DROP TABLE IF EXISTS article_tag;
DROP TABLE IF EXISTS article_author;
DROP TABLE IF EXISTS author;
DROP TABLE IF EXISTS tag;
DROP TABLE IF EXISTS article;
CREATE TABLE IF NOT EXISTS author (
id INT(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(255),
PRIMARY KEY (id)
);
CREATE TABLE IF NOT EXISTS article (
id INT(11) NOT NULL AUTO_INCREMENT,
title VARCHAR(255),
PRIMARY KEY (id)
);
CREATE TABLE IF NOT EXISTS tag (
id INT(11) NOT NULL AUTO_INCREMENT,
tag VARCHAR(255),
PRIMARY KEY (id)
);
CREATE TABLE IF NOT EXISTS article_author (
article_id INT(11) NOT NULL,
author_id INT(11) NOT NULL,
PRIMARY KEY (article_id, author_id),
INDEX fk_article_author_article_idx (article_id ASC) VISIBLE,
INDEX fk_article_author_author_idx (author_id ASC) VISIBLE,
CONSTRAINT fk_article_author_article
FOREIGN KEY (article_id)
REFERENCES article (id),
CONSTRAINT fk_article_author_author
FOREIGN KEY (author_id)
REFERENCES author (id)
);
CREATE TABLE IF NOT EXISTS article_tag (
article_id INT(11) NOT NULL,
tag_id INT(11) NOT NULL,
PRIMARY KEY (article_id, tag_id),
INDEX fk_article_tag_article_idx (article_id ASC) VISIBLE,
INDEX fk_article_tag_tag_idx (tag_id ASC) VISIBLE,
CONSTRAINT fk_article_tag_article
FOREIGN KEY (article_id)
REFERENCES article (id),
CONSTRAINT fk_article_tag_tag
FOREIGN KEY (tag_id)
REFERENCES tag (id)
);
我们可以在数据库中插入一些数据:
INSERT INTO article (id, title) VALUES (1, 'first article'), (2, 'second article'), (3, 'third article');
INSERT INTO author (id, name) VALUES (1, 'first author'), (2, 'second author'), (3, 'third author'), (4, 'fourth author');
INSERT INTO tag (id, tag) VALUES (1, 'first tag'), (2, 'second tag'), (3, 'third tag'), (4, 'fourth tag'), (5, 'fifth tag');
INSERT INTO article_tag (article_id, tag_id) VALUES (1, 1), (1, 2), (1, 3), (2, 2), (2, 4), (2, 5), (3, 1), (3, 2);
INSERT INTO article_author (article_id, author_id) VALUES (1, 1), (1, 2), (1, 3), (2, 2), (2, 4), (3, 1), (3, 2), (3, 3), (3, 4);
现在,在前面的问题中,我检索了文章,对于每一篇文章,我都检索了相关的作者ID和标记ID。提出的解决方案非常优雅:
SELECT a.id, a.title,
(SELECT JSON_ARRAYAGG(aa.author_id)
FROM article_author aa
WHERE a.id = aa.article_id
) as authors,
(SELECT JSON_ARRAYAGG(art.tag_id)
FROM article_tag art
WHERE a.id = art.article_id
) as tags
FROM article a;
但是现在我想检索作者ID,以及他们的名字;标签也一样:标签id和标签本身。
显然,这不是一个微不足道的问题,但我想知道我有什么选择来实现这一点。
1条答案
按热度按时间pdsfdshx1#
您可以使用
JOIN
子查询中的。如果只需要名称,可以使用:我不知道你想要什么样的数据结构,包括ID和名字。如果需要一个json对象数组,每个对象中有两个字段:
这是这个版本的一把小提琴。