[英]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.