2012-08-11 1 views
0

나는 매우 기본적인 테이블 하나를 가지고있다.MySQL : 플랫 테이블의 쿼리 결과 정렬

tblFamiles 
entryID : Int 
name: Text 
parentID: Int 

다음 행을 추가하십시오.

entryID : name     : parentID 
1  : Grandmother Jones  : 0 
2  : Grandmother Thompson : 0 
3  : Mother Jones   : 1 
4  : Mother Thompson  : 2 
5  : 1st Daughter Jones : 3 
6  : 2nd Daughter Jones : 3 
7  : 1st Daughter Thompson : 4 

가 여기에 우리가 두 개의 familes 세 세대가 저장이, 존스 가족 (AN exampe 등) 톰슨 가족. 나는 그들이 상대적 순서에 있도록하지만, 그냥 평범한 오래된 ORDER BY 'parentID' DESC 같이합니다 (parentID에 의해 결과를이 테이블을 쿼리 만 주문하려는이 같은 출력 싶습니다;. 논리적으로 만

SELECT (SOME MAGIC) FROM `tblFamiles`; 
entryID : name     : parentID 
1  : Grandmother Jones  : 0 
3  : Mother Jones   : 1 
5  : 1st Daughter Jones : 3 
6  : 2nd Daughter Jones : 3 
2  : Grandmother Thompson : 0 
4  : Mother Thompson  : 2 
7  : 1st Daughter Thompson : 4 

을 방법은 내가 할 수있는 방법을 볼 수있는 모든 entryIDs 및 다음 각 entryID 루프를 통해 현재 entryID에 대해 자신의 parentID 필드를 확인하고 해당 레코드를 결과 집합의 맨 위에 현재 행 아래에 가져 오는 모든 다른 레코드를 반복하는 것입니다. .하지만 MySQL에서 그렇게하는 방법을 볼 수 없습니다.

UPDATE

나는 위의 예와 같이 가족을 사용했지만, 실제로는 중첩 된 항목을 저장하고 단일 쿼리로 가져와 효율성을 높이는 방법입니다. 나는 단지 복수의 SELECT 쿼리를 만들 수 있지만 그것은 추한 것입니다; 당신은 name 열을 잊을 수

(Pseudo) 
SELECT entryID, name WHERE parentID = 0 LIMIT 0,1; 
print name; 
Sub query: 
SELECT entryID, name WHERE parentID = $above-entryID 
print name; 
    (Keep looping through this till the second query returns no results, 
    then go back to the first query and move onto the next entryID) 

2 UPDATE도 예를 들어, 여기에 모든 문제로 두 개의 링크 열 제어가 entryID 및 이들과 같은 parentID 것을 그냥 사용, 존재 모두. name뿐만 아니라 20 개의 여분의 열이있을 수 있지만 모두 entryIDparentID을 중심으로 회전합니다.이 열은 방금 연결되었거나 중첩 된 ID입니다.

+1

은 왜 단순히 "가족"열을 추가하고 일반 종류를 사용할 수 있습니까? – Mat

+0

두 필드에서 이름 필드를 분리 한 다음 패밀리 이름을 쿼리 할 수 ​​있습니다. – ApplePie

+0

조금 더 설명하기위한 업데이트를 게시하겠습니다. – jwbensley

답변

1

"하지만 MySQL에서 어떻게 할 수 있는지 알 수 없습니다."

짧은 대답

당신은 할 수 없습니다.

약간 더 긴 대답입니다.

해결하려는 문제는 관계형 데이터베이스가 해결하기위한 좋은 해결책이 아니라는 것입니다. 당신이하려는 것은 객체 관계형 데이터베이스가 필요합니다.

이론을 위해 나는 둘 사이의 차이를 읽는 게 좋을 것 : 각 나쁜/좋은 이유에 대한 유래에

http://en.wikipedia.org/wiki/Relational_database

http://en.wikipedia.org/wiki/Object-relational_database

뿐만 아니라 질문입니다.

https://stackoverflow.com/questions/800/object-oriented-vs-relational-databases 또는 The Vietnam of Computer Science로 연결이 대답 https://stackoverflow.com/a/600765/778719 포함 Object-oriented-like structures in relational databases

.

실제로 관계형 데이터베이스에 매핑되는 개체에 대한 내용이지만 방금 발생한 문제에 대한 깊이와 분명한 해결책이 없음을 보여줍니다.

실제로 http://en.wikipedia.org/wiki/Object-relational_impedance_mismatch

사실 가능성이 유용한 답변을 객체 - 관계형 임피던스 부정합을 호출되는 다른 필요로 할 때 하나를 사용하여와 실제 문제는

당신이 설명하는 문제가 가장 처리 하나입니다 개체에 의해. 이제는 관계형 데이터베이스에 저장하는 것이 좋습니다. SQL 계층이 아닌 응용 프로그램 코드 계층에 논리가 있어야하므로 가져 오기가 필요한 경우 데이터베이스에 여러 개의 쿼리를 만들어야합니다. 각 '객체'또는 가능하면 객체의 각 '계층'.

문제가 더 잘 이해되어 다른 기술을 사용하거나 다른 솔루션 간의 절충점을 이해할 수있는 시점까지는 문제가 해결됩니다.

끔찍한 보너스

Cycles in family tree software

+0

당신이 맞습니다. 이것은 객체 관련 데이터입니다. 좋은 대답, 고마워. PHP (응용 프로그램 계층)에서이 문제를 해결하기 위해 재귀 함수로 간단하게 해결할 수 있습니다. 감사! – jwbensley