1
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)

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

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

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

4

2 回答 2

7

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

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

于 2010-08-11T11:02:29.013 回答
0

将整个表读入一个 php 数组,并通过确定子级怎么样。一个会调用自己的函数?

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

于 2010-08-11T11:07:28.130 回答