【问题标题】:Java / MySQL - doing a select on a ResultSetJava / MySQL - 在 ResultSet 上进行选择
【发布时间】:2011-08-06 05:56:12
【问题描述】:

因此,我在 MySQL 上进行了大量选择,并取回了大量数据 - 按索引排序。
例如:

select * from nodes where config_id = 1;  

给予(仅显示相关性)

| definition_id (PK) | position | parent | 
-------------------------------------------
   90                      1         0 << "root"
   08                      2         0
   34                      3         0
   22                      4         0
   17                      1         7  << another defn_id
   38                      2         7
   23                      3         7
   07                      1         90

如果这没有意义,想象一下定义一棵树,其中 90、8、34 和 22 是根的子节点。
那么 7 是 90 的孩子,而 17、38、23 是 7 的孩子(根的孙子)。

为了处理这个问题,我们找到所有父节点为 0 的节点,将它们添加进去,然后查看所有这些节点,看看它们是否有子节点(通过从父节点获取它们,或者看不到任何值并处理它作为一片叶子)。如果他们有孩子,添加他们,并继续递归,直到树建成。
这不是最有效的数据存储,但其中一个要求是“单行更改”以移动节点子集和所有子节点。我宁愿定义一个字符串 0.1.6 等,但事情就是这样。

所以这在测试中工作得相当好,但是当我们需要每天执行 100,000 次时(没有缓存 - 没有意义,都略有不同) - 我们需要尽可能少地访问数据库(即一)。简单,你说,只要抓住整个地段和过程。但是,它们并不都是有序的——正如你在上面看到的,90 低于 7。是的,这些例子是纵容的,但它说明了我们需要某种有序的问题。

基本上,简而言之,问题是,他们是在 ResultSet 上进行子选择的一种简单(而且最好是便宜)的方法 - 即将父 == 7 的所有结果抓取到另一个 ResultSet 中并进行处理?

永恒的爱和感激以换取思想/cmets。

【问题讨论】:

    标签: java mysql resultset subquery


    【解决方案1】:

    我们在我的工作中做的事情非常相似。我们有使用 oracle 的优势,因此“start with...connect by”语法是一种祝福。但是,我们只使用它来加载到内存数据结构中,该结构支持树类型函数,如 get_children、获取兄弟姐妹、获取父母等。

    我会更倾向于使用 db 来加载一些支持这些类型函数的对象。我不擅长 java,所以我不确定实现,但希望这能让你开始。

    【讨论】:

    • 太棒了 - 谢谢 - 结合以上这些让我的生活变得轻松多了。按承诺 +1 和
    【解决方案2】:

    您可以在临时表中进行第一次选择

    http://dev.mysql.com/doc/refman/5.1/en/create-table.html

    然后在临时表上进行辅助选择。临时表是“每个连接”的,因此这可能对您有用,也可能不适用。

    【讨论】:

    • 这对我不起作用,但非常感谢您的建议!
    【解决方案3】:

    您可以在 DBMS 级别上执行此操作,例如在 MySQL http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ 上查看此处。

    WhiteFang34 的回答很好,因为 mySQL 不支持分层查询(可以在 ORACLE 中找到:start ... connect by)。可能将来会实施,但现在我们只能使用变通方法(例如在链接上)。基本思想是在运行 DBMS 以及供应商实现递归查询的机器上使用内存(通过优化、强大的算法、支持等)。

    其他解决方法是编写存储过程。

    【讨论】:

    • 谢谢 - 但是在它前面坚持解释几乎让我心脏病发作。你能详细说明一下优化吗?
    • 我不知道在 MySQL DMBS 上可以应用什么样的优化方法。我的经验通常基于ORACLE。例如,在 ORACLE 中,您可以使用递归查询来解决您的问题。可能你可以在 MySQL 中编写存储过程来加载 DBMS 服务器并发布 java app-server。因此,这种方法适用于比您更好地处理数据的 DBMS 服务器。这是基本的想法:-)。
    【解决方案4】:

    我不知道在ResultSet 上进行子选择的方法。如果你想保留一个查询,你可以用这样的方式在内存中管理它:

    // class to represent your rows
    class Row {
        int definitionId;
        int position;
        int parent;
    }
    
    // map of parents to list of their rows
    Map<Integer, List<Row>> parentMap = new HashMap<Integer, List<Row>>();
    
    // iterate over all results, build row objects and populate the map
    while (rs.next()) {
        Row row = new Row();
        row.definitionId = rs.getInt("definition_id");
        row.position = rs.getInt("position");
        row.parent = rs.getInt("parent");
    
        // find the list of rows for the parent, create it if it doesn't exist
        List<Row> rows = parentMap.get(row.parent);
        if (rows == null) {
            rows = new ArrayList<Row>();
            parentMap.put(row.parent, rows);
        }
    
        // add row to the list for its parent
        rows.add(row);
    }
    
    // find all rows for parent == 7
    for (Row row : parentMap.get(7)) {
        // process row
    }
    

    【讨论】:

      猜你喜欢
      • 2020-01-27
      • 1970-01-01
      • 1970-01-01
      • 2017-07-22
      • 1970-01-01
      • 1970-01-01
      • 2015-09-21
      • 1970-01-01
      • 2018-03-07
      相关资源
      最近更新 更多