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 时,第二张表的构建速度很快,但我现在坚持使用 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 回答