这是您项目的建议结构。在您的情况下,可能是articles 表,而不是books 或作者和合著者相关的任何其他内容。通过这种方式,之后对您的数据进行查询会容易得多:
SQL Fiddle
MySQL 5.5.32 架构设置:
CREATE TABLE books
(`id` int, `title` varchar(5));
INSERT INTO books
(`id`, `title`)
VALUES
(1, 'book1'),
(2, 'book2'),
(3, 'book3'),
(4, 'book4');
CREATE TABLE authors
(`id` int, `name` varchar(8));
INSERT INTO authors
(`id`, `name`)
VALUES
(1, 'Ronnie'),
(2, 'Razor'),
(3, 'Taz'),
(4, 'Baron'),
(5, 'vinay'),
(6, 'karthick'),
(7, 'earl'),
(8, 'gopal'),
(9, 'webster'),
(10, 'karthick'),
(11, 'arun'),
(12, 'ming'),
(13, 'sanjeev');
CREATE TABLE type
(`id` int, `type` varchar(9));
INSERT INTO type
(`id`, `type`)
VALUES
(1, 'author'),
(2, 'co-author');
CREATE TABLE wrote
(`id` int, `book_id` int, `author_id` int, `type_id` int);
INSERT INTO wrote
(`id`, `book_id`, `author_id`, `type_id`)
VALUES
(1, 1, 1, 1),
(2, 2, 2, 1),
(3, 3, 3, 1),
(4, 4, 4, 1),
(5, 1, 5, 2),
(6, 2, 6, 2),
(7, 3, 7, 2),
(8, 4, 8, 2),
(9, 1, 8, 2),
(10, 2, 9, 2),
(11, 3, 10, 2),
(12, 4, 11, 2),
(13, 1, 11, 2),
(14, 2, 12, 2),
(15, 3, 5, 2),
(16, 4, 13, 2);
这是您的实际数据:
查询 1:
SELECT b.id, a.name as author, group_concat(co.name) as co_authors
FROM books b
INNER JOIN wrote wa ON wa.book_id = b.id AND wa.type_id = 1
INNER JOIN authors a ON wa.author_id = a.id
INNER JOIN wrote wco ON wco.book_id = b.id AND wco.type_id = 2
INNER JOIN authors co ON wco.author_id = co.id
GROUP BY b.title, a.name
Results:
| ID | AUTHOR | CO_AUTHORS |
|----|--------|-----------------------|
| 1 | Ronnie | arun,vinay,gopal |
| 2 | Razor | webster,ming,karthick |
| 3 | Taz | earl,karthick,vinay |
| 4 | Baron | sanjeev,gopal,arun |
这就是你想要做的。
注意AND a.id in (1,4); 其中id 1 是Ronnie 而id 4 是Baron:
查询 2:
SELECT co.name as coauthor
FROM books b
INNER JOIN wrote wa ON wa.book_id = b.id AND wa.type_id = 1
INNER JOIN authors a ON wa.author_id = a.id AND a.id in (1,4)
INNER JOIN wrote wco ON wco.book_id = b.id AND wco.type_id = 2
INNER JOIN authors co ON wco.author_id = co.id
GROUP BY co.name
HAVING count(co.name) > 1
Results:
| COAUTHOR |
|----------|
| arun |
| gopal |