1

次のMySQLテーブルがあります

ArticleId | AuthorId | Author | ArticleScore
----------|----------|--------|-------------
0         |0         |Albert  |0.2
0         |1         |Bob     |0.2
0         |2         |Chris   |0.2
1         |0         |Albert  |0.5
1         |1         |Chris   |0.5
2         |0         |Chris   |0.7

次のテーブルを取得したいと思います。ここで、AuthorScore は、著者が書いたすべての記事の articleScore の合計を記事の数で割ったものです。

Table Authors

Author | AuthorScore
-------|------------
Albert | (0.2 + 0.5)/2
Bob    | 0.2
Chris  | (0.2 + 0.5 + 0.7)/3

上記のテーブルをmysql言語で取得するにはどうすればよいですか? Javaでループを書くことができます:

for (String author: authorList){
    double sum = 0.0;
    double autScore =0.0;
    List<Double> results = em.createQuery("SELECT ArticleScore FROM Table WHERE Author ='" + author +"'").getResultList();

    for (double artScore: results){
        sum += artScore;
    }

    autScore = sum / results.size();
    Table t = new Table();
    t.setAuthor(author);
    t.setAuthorScore(autScore);
    em.persist();
}
em.flush();

しかし、これは 2 つのループのために非常に非効率的であり、複数の著者による 100 万の記事があります。MySQLでこれを行う方法はありますか??

私はそれがその線に沿っているかもしれないと思う

SELECT sum(t.ArticleScore) / number of rows FROM Table t JOIN Authors a ON (t.author = a.author) WHERE  t.author = a.author

しかし、行の合計と数を取得するために数学演算を行う方法がわかりません...

4

1 に答える 1

1

avg集計関数を使用して、これを完全に SQL で実行する必要があります。

select author, avg(articlescore) from your_first_table group by author;

その後、必要に応じて結果を使用できます-前述のように別のテーブルに挿入しますが、代わりにこの単純なクエリを再実行するか、ビューを作成することをお勧めします.

于 2013-08-21T03:23:09.743 に答える