0

表示されている人物の写真は偽のデータです。 これは私のテーブル構造です

ID | 著者 | 共著者

1 | ロニー | ロニー | ビナイ、ゴパル、アルン
2 | かみそり | かみそり カーシック、ウェブスター、ミン
3 | タズ | タズ | 伯爵、カーシック、ビネイ
4 | バロン | ゴパル、アルン、サンジーブ

ここで、ronnie と baron という 2 人の著者を選択したいので、彼らの共著者を比較する必要があります。この場合、一致は gopal と arun になるため、出力は gopal と arun になります。

mysqlクエリでそれを行う方法。助けてください。

4

2 に答える 2

2

これは、プロジェクトの推奨構造です。あなたのケースでは、著者や共著者が関連するものでarticlesはなく、テーブルになるかもしれません。booksこのようにして、後でデータのクエリを実行するのがはるかに簡単になります:

SQL フィドル

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

結果

| 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あるかに注意してください。Ronnieid 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

結果

| COAUTHOR |
|----------|
|     arun |
|    gopal |
于 2013-09-19T03:16:02.220 に答える
0

次のようなことを試してください:

Authors というテーブル (すべての著者と共著者をこのテーブルに入れます)

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

次に、著者間の関係の表

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

等々。著者/共著者関係ごとに 1 行。

于 2013-09-19T03:16:57.173 に答える