【问题标题】:mysql recursive self joinmysql递归自连接
【发布时间】:2012-07-25 05:21:05
【问题描述】:
create table test(
container varchar(1),
contained varchar(1)
);

insert into test values('X','A');
insert into test values('X','B');
insert into test values('X','C');
insert into test values('Y','D');
insert into test values('Y','E');
insert into test values('Y','F');
insert into test values('A','P');
insert into test values('P','Q');
insert into test values('Q','R');
insert into test values('R','Y');
insert into test values('Y','X');

select * from test;

    mysql> select * from test;
    +-----------+-----------+
    | container | contained |
    +-----------+-----------+
    | X         | A         |
    | X         | B         |
    | X         | C         |
    | Y         | D         |
    | Y         | E         |
    | Y         | F         |
    | A         | P         |
    | P         | Q         |
    | Q         | R         |
    | R         | Y         |
    | Y         | X         |
    +-----------+-----------+
    11 rows in set (0.00 sec)

我可以使用单个自联接找出“X”下包含的所有distinct 值吗?

EDIT

喜欢,这里 X 包含 A、B 和 C A 包含 P P 包含 Q Q 包含 R R 包含 Y Y 包含 C、D 和 E...

所以我想在查询 X 时显示 A、B、C、D、E、P、Q、R、Y。

EDIT

通过编程搞定。

package com.catgen.helper;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.catgen.factories.Nm2NmFactory;

public class Nm2NmHelper {
    private List<String> fetched;
    private List<String> fresh;

    public List<String> findAllContainedNMByMarketId(Connection conn, String marketId) throws SQLException{
        fetched = new ArrayList<String>();
        fresh = new ArrayList<String>();
        fresh.add(marketId.toLowerCase());
        while(fresh.size()>0){
            fetched.add(fresh.get(0).toLowerCase());
            fresh.remove(0);
            List<String> tempList = Nm2NmFactory.getContainedNmByContainerNm(conn, fetched.get(fetched.size()-1));
            if(tempList!=null){
                for(int i=0;i<tempList.size();i++){
                    String current = tempList.get(i).toLowerCase();
                    if(!fetched.contains(current) && !fresh.contains(current)){
                        fresh.add(current);
                    }
                }
            }
        }
        return fetched;
    }
}

虽然不是同一个表和字段。但我希望你明白这个概念。 谢谢大家。

【问题讨论】:

    标签: mysql recursion self-join


    【解决方案1】:

    您无法使用具有该数据结构的单个连接递归地获取所有包含的对象。你需要一个递归查询,但 MySQL 还不支持。

    但是,您可以构建一个闭包表,然后您可以通过一个简单的查询来完成。有关更多详细信息和其他方法(例如嵌套集),请参阅 Bill Karwin 的幻灯片 Models for heirarchical data。幻灯片 69 比较了不同设计,以便于实现“查询子树”。您选择的设计(邻接列表)是此类查询的所有四种设计中最尴尬的。

    【讨论】:

    • 很棒的资源!你刚刚挽救了我的理智。
    【解决方案2】:

    如何将整个表读入一个 php 数组,并通过。一个会调用自己的函数?

    但是如果表超过 10000 行,这不是一个好的解决方案...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-28
      • 2015-05-05
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多