【问题标题】:Loop MySQL run with java循环 MySQL 用 java 运行
【发布时间】:2017-03-24 02:54:59
【问题描述】:

我有 3 个表格,内容如下:

Author
idAuthor INT
name VARCHAR

Publication
idPublication INT
Title VARCHAR
Date YEAR
Type VARCHAR
Conference

author_has_publication
author_idAuthor INT
publication_idPublication INT

我正在尝试对作者进行关系模式。目的是显示他们共有的出版物数量。作者的名字是参数,我最多可以有 8 个名字。我的代码给出了 2 个作者之间的共同出版物的数量,所以我必须循环它。我目前正在使用 Java 循环和 SQL 语句来执行此操作。这是SQL部分

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;
    }

这是循环部分(当给出超过 2 个作者时重复 SQL)并生成图形:

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 挂起,我检查MySQL 过程,但我的问题是如何处理作者名称参数,因为它是一个变量。

【问题讨论】:

  • 阅读加入
  • 您应该使用Prepared 语句。如果您还没有考虑到这一点,我可以写一个关于它的答案,以及一些性能改进技术。
  • 我认为您可以使用子查询和连接来做到这一点。
  • 不太明白,目前的代码已经在使用joins和subquery了
  • 不,我没有考虑准备好的陈述

标签: java mysql loops stored-procedures optimization


【解决方案1】:

一种方式,在一个语句中:

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 

需要复合索引:

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

注意:每种技术都可以很容易地扩展到 2 位以上的作者。第二个查询甚至可以适应“这 5 位作者中的至少 3 位”:INHAVING COUNT(*) &gt;= 3 中的 5 个姓名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-30
    • 2015-10-13
    • 2016-05-27
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多