2010-08-11 34 views
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) 

我可以使用單個自連接找出'X'下包含的所有distinct值嗎?mysql遞歸自加入

EDIT

一樣,這裏 X含有A,B和C 甲含有P P包含Q Q含有ř R含有ý Y含有C,d和E ...

所以我想顯示A,B,C,d,E,P,Q,R,Y,當我查詢X.

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

雖然不是同一張表和字段。但我希望你明白這個概念。 謝謝你們。

回答

7

無法使用具有該數據結構的單個連接遞歸地獲取所有包含的對象。你需要遞歸查詢,但MySQL還不支持。

然而,你可以構造一個閉包表,然後你可以用一個簡單的查詢來完成。有關更多詳細信息和其他方法(例如,嵌套集),請參見Bill Karwin的幻燈片Models for heirarchical data。幻燈片69比較了不同的設計,以便於實現'查詢子樹'。您選擇的設計(鄰接列表)是這類查詢所有四種設計中最難的。

+0

很好的資源!你只是救了我的理智。 – Rustavore 2013-04-11 01:08:09

0

怎樣將整個表格讀取到php數組中,並通過確定孩子。一個會自動調用的函數?

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