2016-11-10 17 views
0

で実行します。目的は共通の出版物の数を示すことです。著者の名前はパラメータで、最大8つの名前を持つことができます。私のコードは2人の著者の間で共通の出版物の数を与えているので、私はそれをループしなければならない。私は現在、JavaループとSQLステートメントを使用しています。ここでは(与えられた2人の以上の作者がいる時にSQLを繰り返す)とグラフを生成するSQL一部ここループMySQLは、私は以下の内容を持つ3つのテーブルを持っているのjava

private int runQuery(String a1, String a2){ // a1 author 1 and a2 author 2 
     try { 
      auth1 = new ArrayList<String>(); 
      Class.forName("com.mysql.jdbc.Driver"); 
      Connection connection = DriverManager.getConnection(
        "jdbc:mysql://localhost:3306/mydb", "root", "ROOT"); 
      Statement stmt = connection.createStatement(); 
      long start = System.currentTimeMillis(); 


      String queryUpdate1 = "DROP TABLE IF EXISTS temp1;"; 
      String queryUpdate2 = "DROP TABLE IF EXISTS temp2;"; 
      String queryUpdate3 = "CREATE TEMPORARY TABLE IF NOT EXISTS temp1 AS (SELECT Author.name, Publication.idPublication, Publication.title FROM Author INNER JOIN Author_has_Publication ON Author_has_Publication.author_idAuthor=author.idAuthor INNER JOIN Publication ON Author_has_Publication.publication_idPublication=publication.idPublication WHERE Author.name='"+ a1+"');"; 
      String queryUpdate4 = "CREATE TEMPORARY TABLE IF NOT EXISTS temp2 AS (SELECT Author.name, Publication.idPublication, Publication.title FROM Author INNER JOIN Author_has_Publication ON Author_has_Publication.author_idAuthor=author.idAuthor INNER JOIN Publication ON Author_has_Publication.publication_idPublication=publication.idPublication WHERE Author.name='"+ a2+"');"; 
      String query = "SELECT COUNT(*) FROM (SELECT temp1.title from temp1 INNER JOIN temp2 on temp1.idPublication = temp2.idPublication) as t;"; 

      stmt.executeUpdate(queryUpdate1); 
      stmt.executeUpdate(queryUpdate2); 
      stmt.executeUpdate(queryUpdate3); 
      stmt.executeUpdate(queryUpdate4); 
      ResultSet rs = stmt.executeQuery(query); 
      int result = -1; 
      while (rs.next()) { 
       result = rs.getInt(1); 
      } 

      System.out.println("result = " + result); 
      long end = System.currentTimeMillis() - start; 
      queryTimeLabel.setText("Query Execution Time :"+end); 
      connection.close(); 
      return result; 
     } catch (Exception e) { 
      System.out.println(e); 
     } 
     return -1; 
    } 

がループの一部であり、次のとおりです。

public void actionPerformed(ActionEvent e) { 

    graph = new mxGraph(); 
    Object parent = graph.getDefaultParent(); 
    authVertex = getAuthors(); 



    // /////////////////////////////////// 
    // CREATES GRAPH, Graph only shows up after you resize the window 
    graph.getModel().beginUpdate(); 
    try { 

     int i = 0; 
     for(String a: authVertex.keySet()){ 
      int j = 0; 
      for(String b: authVertex.keySet()){ 
       if(j > i) { 
        graph.insertEdge(parent, null, String.valueOf(runQuery(a,b)), authVertex.get(a), authVertex.get(b)); // loop the SQL statement 2 by 2. 
       } 
       j++; 
      } 
      i++; 
     } 
    } finally { 
     graph.getModel().endUpdate(); 
    } 

    graphComponent = new mxGraphComponent(graph); 
    graphPan.removeAll(); 
    graphPan.add(graphComponent); 
    setVisible(true); 
    // ///////////////////////////////////////// 


} 

私のコードは、現在取り組んでいるが、 MySQLにすべてを渡すことでパフォーマンスを向上させることが可能かどうかを知りたいのですが、それはパラメータに著者名を入力してループがMySQLによってハンギングされていることを意味します。 authorsは変数であるため、パラメータに名前を付けます。

+0

続きを読むJOIN – e4c5

+0

あなたは 'Prepared'ステートメントを使うべきです。これについて考えなかったなら、私はそれについての答えといくつかのパフォーマンス改善テクニックを書くことができます。 – GOXR3PLUS

+0

私はサブのクエリと結合を使ってそれを行うことができると思います。 – chomnoue

答えて

0

一つの方法、単一のステートメントで:

Author_has_Publication: (author_idAuthor, publication_idPublication) 
Author_has_Publication: (publication_idPublication, author_idAuthor) 
Author: (name, id) 

注:各技術はかなり容易に拡張することができます

SELECT COUNT(*) 
    FROM Author_has_Publication AS ap1 
    JOIN Author_has_Publication AS ap2 ON ap1.publication_idPublication = 
              ap2.publication_idPublication 
    JOIN Author AS a1 ON ap1.author_idAuthor = a1.id_Author 
    JOIN Author AS a2 ON ap2.author_idAuthor = a2.id_Author 
    WHERE a1.name = '...' 
     AND a2.name = '...' 

もう一つの方法は、必要に応じ

SELECT COUNT(*) 
    FROM 
    (
     SELECT ahp.publication_idPublication, COUNT(*) 
      FROM Author_has_Publication AS ahp 
      JOIN Author AS a ON a.id_Author = ahp.author_idAuthor 
      WHERE a.name IN ('...', '...') 
      GROUP BY ahp.publication_idPublication 
      HAVING COUNT(*) = 2 -- Number of authors 
    ) x 

複合インデックスかもしれ2人以上の著者に。 2番目のクエリは、「5人の著者のうち少なくとも3人」に適合させることもできます:INHAVING COUNT(*) >= 3の5つの名前。

関連する問題