簡體   English   中英

MySQL遞歸自連接

[英]mysql recursive self join

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和CA包含PP包含QQ包含RR包含YY包含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尚不支持。

但是,您可以構造一個閉合表,然后可以通過一個簡單的查詢來完成它。 有關更多詳細信息和其他方法(例如,嵌套集),請參見Bill Karwin的幻燈片模型中的分層數據 幻燈片69比較了不同的設計,以便於實現“查詢子樹”。 對於這種類型的查詢,在所有四個設計中,您選擇的設計(鄰接列表)是最尷尬的。

如何將整個表讀入php數組,並通過確定子項。 一個會自稱的功能?

但這不是一個很好的解決方案,如果表具有超過10000行...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM