2010-06-16 2 views
3

내가 진행하고있는 프로젝트에서, 나는 하데스의 테이블 구조에 매달렸다. 유의해야 할 두 가지 사항은 다음과 같습니다.내가 찾는 데이터를 가져올 수있는 MySQL 쿼리?

  1. 지금은 표 구조를 변경할 수 없습니다. 나는 당분간 그것에 붙어있다.
  2. 쿼리가 동적으로 생성되고 하드 코딩되지 않습니다. 따라서이 데이터를 가져올 수있는 쿼리를 요청하는 동안 실제로 필요한 작업은 필요한 쿼리를 생성하는 알고리즘입니다.

바라건대, 나는 눈을 숙이 게하고 뇌가 내파르게하지 않고 문제를 설명 할 수 있기를 바랍니다. 여러 데이터 테이블이 라인을 따라가, 그리고

 
Instances 
InstanceID active 
1    Y 
2    Y 
3    Y 
4    N 
5    Y 
6    Y 

: 표가 포함에

 
Table1 

InstanceID field1 reference_field2 
1    John  5 
2    Sally  NULL 
3    Fred   6 
4    Joe   NULL 


Table2 
InstanceID field3 
5    1 
6    1 


Table3 
InstanceID fieldID field4 
5    1  Howard 
5    2  James 
6    2  Betty 

는 reference_field2을 유의하시기 바랍니다

우리는이 라인을 따라 (간체) 보이는 인스턴스 테이블이 다른 인스턴스에 대한 참조입니다. Table2의 Field3은 좀 더 복잡합니다.

 
InstanceID field1  field4  
1    John  Howard 
2    Sally 
3    Fred 

문제는, 내가 현재 가지고있는 쿼리에, 내가하지 않는 프레드 : 그것은 내가해야 할 것은 다음과 같이 나에게 목록을 얻을 것이다 쿼리는 3

표에 대한 fieldID가 포함되어 있습니다 fieldID가 1 InstanceID에 6의 표 3에 항목이 없기 때문에 그래서, 최고의 목록 내가 지금까지 얻을 수 있었던 것입니다있다

 
InstanceID field1  field4  
1    John  Howard 
2    Sally 
본질적으로

, 필드 2의 표에 항목이있는 경우, 표 3에는 field2에 포함 된 instanceID와 필드 ID contai가있는 항목이 없습니다. field3의 네드, 나는 field1에서 데이터를 가져 오지 않습니다.

전 얼굴이 파란색 일 때까지 조인을 보았습니다. table3에 항목이없는 경우 사례를 처리 할 수있는 방법이 없습니다. 좌 가입

+0

MySQL은 OUTER JOINS를 허용합니까? – FrustratedWithFormsDesigner

답변

2

...

SELECT a.InstanceID, b.field1, d.field4 
FROM instances AS a 
    JOIN Table1 AS b ON a.InstanceID = b.InstanceID 
    LEFT JOIN Table2 AS c ON b.reference_field2 = c.InstanceID 
    LEFT JOIN Table3 AS d ON (c.InstanceID = d.InstanceID AND c.field3 = d.fieldId) 
WHERE a.active = 'Y' 

왼쪽 두 개의 다른 행이없는 경우를 ... 처리해야 조인

+0

쿼리에 한 가지 문제가 있습니다. 표 3의 fieldID가 표 2의 인스턴스에 대해 나열된 FieldID와 동일해야합니다. 그러면 WHERE 절이 내 결과에서 Fred를 죽이는 것처럼 보입니다. –

+0

먼저 테이블 3의 fieldID가 표 2의 fieldID와 같아야합니다 (테이블 3 조인의 ON 절의 두 번째 부분).WHERE 절이 Fred를 죽이는 경우 (샘플 데이터를 기반으로해서는 안됨), fred에 대한 '활성'은 실제로 "Y"(공백이 있음)입니까? 아니면 단순한 'Y'가 아닌 ...? – ircmaxell

+0

게시 한 내용을 토대로 내 솔루션의 경로를보기 시작했습니다. Where 절을 삭제하고 조인 구문을 대신 사용해야합니다. 실제 쿼리는이 예제보다 훨씬 더 멋지지만, 지금은 어떻게 할 지에 대해 깜박 거리는 것을 보았습니다. 감사합니다. Amy –

1

당신은 당신이 가지고있는 쿼리를 게시 경우는, 도움이 될 나는 때문에 여기 테이블 설명에 실수가 있다고 생각합니다. 따라서 테이블 연결 방법이 명확하지 않습니다.

어쨌든 쿼리에 내부 조인이 있습니다 (보통 JOIN으로 작성). 이 값을 왼쪽 외부 조인 (LEFT JOIN)으로 바꿉니다. 오른쪽 테이블에 행을 포함 할 필요가 없으며 실제 값 대신 NULL을 반환합니다.

+0

내가 실제 쿼리에 얻을 수있는 가장 가까운이 는 SELECT Instances.InstanceID, Table1.field1, 인스턴스 FROM Table3.field4 LEFT는 표 2 ON Instances.InstanceID = 표 가입 Instances.InstanceID = Table1.InstanceID 왼쪽에 표를 가입. Table1.field1 오름차순 BY Instances.active = 'Y'AND (Table3.fieldID = Table2.fieldID OR Table1.field2가 null) 순서 실제 쿼리이고 fieldID2 왼쪽 Table2.InstanceID = Table3.InstanceID 표 3 가입 테이블 이름이 모두 동적으로 생성되기 때문에 더욱 신빙성이 없습니다. –

+0

정확한 테이블을 보지 않으면 도움이 어렵습니다. 예를 들어 여기에서 "Instances.InstanceID = Table1.fieldID2"에있는 테이블을 조인합니다. 그건 나에게 의미가 없으며, 당신이 질문에 쓴 것과는 다릅니다. –

관련 문제