我有一个books表,它与genre表和authors表有多对多关联。其目的是在一个单一的选择语句中提取出关于一本书的所有相关信息。
我使用的是MariaDB 10.11,小提琴是10.9
下面是创建和填充表格的代码,我还链接到一个dbfiddle
CREATE TABLE book (id int AUTO_INCREMENT PRIMARY KEY, title varchar(30));
CREATE TABLE author_example (id int AUTO_INCREMENT PRIMARY KEY, name varchar(50));
CREATE TABLE genre (id int AUTO_INCREMENT PRIMARY KEY, genre varchar(50));
CREATE TABLE associate_book_genre (
genre_id int NOT NULL,
book_id int NOT NULL,
CONSTRAINT pk_book_genre PRIMARY KEY (book_id, genre_id)
);
CREATE TABLE associate_book_author (
author_id int NOT NULL,
book_id int NOT NULL,
CONSTRAINT pk_book_genre PRIMARY KEY (book_id, author_id)
);
INSERT INTO genre (genre) VALUES ("travel"),("philosophy"),("nonfiction");
INSERT INTO author_example (name) VALUES ("Paul Tillich"),("Douglas Adams"),("Mark Carardine");
INSERT INTO book (title) VALUES ("The Courage to Be"), ("Last Chance to See"),("Beowulf"),("Debate between bird and fish");
字符串
https://dbfiddle.uk/74kXDrRM
我的目标是检索这个表:
| 作者|类型| Genres |
| --|--| ------------ |
| 零|零| null |
| 道格拉斯·亚当斯&马克·卡拉丁|旅行,非小说| travel, nonfiction |
| 保罗·蒂利希|哲学| philosophy |
| 零|零| null |
我最接近的是
SELECT b.title,
GROUP_CONCAT(a.name SEPARATOR " & ") as author,
GROUP_CONCAT(g.genre SEPARATOR ", ") as genre FROM book b
left join associate_book_author aba on b.id = aba.book_id
left join author_example a on aba.author_id=a.id
left join associate_book_genre abg on b.id = abg.book_id
left join genre g on abg.genre_id =g.id
group by g.id;
型
| 作者|类型| Genres |
| --|--| ------------ |
| 零|零| null |
| 道格拉斯·亚当斯&马克·卡拉丁|旅行,旅行| travel, travel |
| 保罗·蒂利希|哲学| philosophy |
| 道格拉斯·亚当斯&马克·卡拉丁|非小说类,非小说类| nonfiction, nonfiction |
然而,我错过了“鸟与鱼之间的辩论”,因为流派是空的“鸟与鱼之间的辩论”和“贝奥武夫”和“最后的机会看到”是列出了两次,流派是错误的。
2条答案
按热度按时间eoigrqb61#
您应该单独聚合作者和流派:
字符串
修改Fiddle
b09cbbtk2#
我改变了分组的方式,并使结果DISTINCT(唯一),而不是像
group by g.id
那样,我这样做了:GROUP BY b.id, b.title
尝试运行此查询:https://dbfiddle.uk/WwUjVeFo字符串
的数据