0

以下の例では、著者とその論文を含む書誌テーブルがあります。たとえば、著者 '001' と '003' は一緒に記事 '678' を書きました。

articleId | authorId
123 | 001
123 | 002
345 | 002
345 | 003
345 | 004
678 | 001
678 | 003

共通の著者に基づいて、著者間の共起を選択する必要があります。たとえば、上の表の場合、次の表を作成する必要があります。

AuthorA | AuthorB
001 | 002
002 | 003
002 | 004
003 | 004
001 | 003

最初のテーブルは非常に大きい (約 1.800.000 行)。最初に MS SQL Server 2008 を試したとき、2 番目のテーブルの構築は高速でしたが、今は MySQL にこだわっています。次のクエリを使用します。

SELECT foo.authorId AS authorA, bar.authorId AS authorB
  FROM
    (SELECT * FROM tblAuthorHasBib) AS foo,
    (SELECT * FROM tblAuthorHasBib) AS bar
  WHERE
    foo.articleId = bar.articleId
  AND
    foo.authorId <> bar.authorId
  GROUP BY foo.authorId, bar.authorId

MS SQL と同じくらい高速になるようにクエリを書き直すにはどうすればよいですか? ご指摘ありがとうございます。

4

1 に答える 1

3

以下に示すようにクエリを記述できます。これにより、GROUP BY句とインライン ビューを使用する必要がなくなります。

SELECT foo.authorId AS authorA, bar.authorId AS authorB
FROM tblAuthorHasBib foo
JOIN tblAuthorHasBib bar
   ON foo.articleId = bar.articleId 
WHERE foo.authorId != bar.authorId

または、@ 1osmi のコメントに従って、著者の一意の順列のみが必要な場合は、以下に示すように!=を置き換えることができます<

SELECT foo.authorId AS authorA, bar.authorId AS authorB
FROM tblAuthorHasBib foo
JOIN tblAuthorHasBib bar
   ON foo.articleId = bar.articleId 
WHERE foo.authorId < bar.authorId
于 2012-10-07T12:47:54.013 に答える