如何比较逗号分隔值和两个不同的ids-php mysql

时间:2013-09-19 02:53:32

标签: php mysql sql optimization

所显示的人的照片只是假数据。 这是我的表结构

id |作者|共同作者

1 |罗尼| vinay,gopal,arun
2 |剃刀|卡斯蒂克,韦伯斯特,明星 3 |塔兹|伯爵,karthick,vinay
4 |男爵| gopal,arun,sanjeev

现在我想选择两个作者说ronnie和baron,所以现在应该比较他们的共同作者。在这种情况下,匹配将是gopal,arun所以输出应该是gopal和arun。

如何在mysql查询中执行此操作。请帮忙。

2 个答案:

答案 0 :(得分:2)

这是您项目的建议结构。可能是您的案例中的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 1Ronnieid 4Baron

查询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 |

答案 1 :(得分:0)

尝试这样的事情:

一个名为Authors的表(将所有作者和共同作者放在此表中)

id  |  Author
1   |  Bob
2   |  Jim
3   |  Sally
4   |  Joan

然后是作者之间关系的表格

id  |  authorid  |  coauthorid
1   |  1         |  4
2   |  2         |  3
3   |  1         |  3

等等。每个作者/共同作者关系一行。