1

我有一个表(n2m),其中包含作者的 id 和他们的文章的 id。我正在计算表格中只有一篇文章的作者人数。我正在使用以下查询:

select count(*) from authors_articles
where   AutID in
    (
     select AutID
     from authors_articles
     group by AutID
     having count(distinct articleID) = 1
    )

现在,我想知道我的查询是否正确,无论如何我可以改进这个查询以使其更快!?

非常感谢,

4

3 回答 3

3

您的查询可以简化为:

select count(*) from 
    (
     select AutID
     from authors_articles
     group by AutID
     having count(distinct articleID) = 1
    ) x
于 2013-05-31T02:23:15.540 回答
0

我认为它可以更简单:

SELECT count(*) num_articles
FROM authors_articles
GROUP BY AutID
HAVING num_articles = 1
于 2013-05-31T02:27:20.230 回答
0

您的查询是正确的。

MySQL 碰巧实例化了子查询,并且对group by. 如果您在 上有一个索引authors_articles(autId, articleId),则以下内容可能会执行得更好:

select count(*)
from authors_articles aa left outer join
     authors_articles aa1
     on aa.autId = aa1.autId and
        aa.articleId <> aa1.articleId
where aa1.autId is NULL;

left outer join有助于将作者与他们可能撰写的任何其他文章相匹配。如果没有,那么作者有一篇文章,聚合计算在内。

这可能会奏效。它可能会表现得更好,这在适当的情况下可能非常非常重要。不过,总的来说,我会坚持您的查询,因为我发现它的意图更清楚。

于 2013-05-31T02:41:30.260 回答