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 では、「クエリ サブツリー」の実装を容易にするためのさまざまな設計を比較しています。選択したデザイン (隣接リスト) は、このタイプのクエリの 4 つのデザインすべての中で最も扱いにくいものです。

于 2010-08-11T11:02:29.013 に答える
0

テーブル全体をphp配列に読み込み、子を決定するのはどうですか. 自分自身を呼び出す関数?

ただし、テーブルに10000行を超える行がある場合、これは良い解決策ではありません...

于 2010-08-11T11:07:28.130 に答える