2011-08-25 5 views
0

약간의 SQL이 있지만 텍스트를 숫자로 되돌릴 수있는 방법을 찾을 수 없습니다. - 개정!복잡한 SQL 쿼리 문제

SELECT if(`linktype` = "group", 

(SELECT contactgroups.grname 
FROM contactgroups, groupmembers 
WHERE contactgroups.id = groupmembers.id ??? 
AND contactgroups.id = groupmembers.link_id), 

(SELECT contactmain.contact_sur 
FROM contactmain, groupmembers 
WHERE contactmain.id = groupmembers.id ??? 
AND contactmain.id = groupmembers.link_id)) AS adat 

FROM groupmembers; 

지금은 약간의 정보가 다시 제공되지만 개선 되었습니까? (minitech 덕분에) 내 문제를 나타냅니다. 나는 내가 어떻게 고칠 수 있는지 알지 못한다. .. 어떤 충고가 환영 받았다! Thansk

Contactmain (id, contact_sur, email2) 

data: 
1 | Peter | [email protected] 
2 | Andrew| [email protected] 

Contactgroups (id, grname) 

data: 
1 | All 
2 | Trustee 
3 | Comitee 

Groupmembers (id, group_id, linktype, link_id) 

data: 
1 | 1 | contact | 1 
2 | 1 | contact | 2 
3 | 2 | contact | 1 
4 | 3 | group | 2 

그리고 나는, 내가 바로 :)

+0

만약'contactgroups.id'가'groupmembers.id'와 같아야하지만'2'와 같아야한다면, 그것은 중복되고 문제가있는 곳이라고 생각합니다. – Ryan

+0

두 번째 질문이 당신에게 옳은 대답을주고 있다면 왜 그 대답을 사용할 수 없습니까? 또한, 당신에게 잘못된 질문을하는 첫 번째 쿼리는 무엇입니까? 실제로 예상 한 결과는 무엇입니까? 주의 : 여기서 우리 대부분은 쉼표로 구분 된'FROM' 절을 싫어합니다. 왜냐하면'JOIN' 조건을 이해하기 어렵게 만들 수 있기 때문입니다 - eplicit-join 구문을 사용하십시오. –

+0

테이블 스키마와 샘플 데이터를 제공하십시오. 테이블 스키마가 없으면 숫자 대신 텍스트를 가져 오는 이유를 알기가 어렵습니다. –

답변

1

ID와 Link_ID 열의 값이 같기 때문에 조인에서 조금 중복됩니다. BOTH 선택 값은 그룹 멤버 테이블에 대한 자격에서 파생되었으므로 기본 테이블로 THAT을 사용하도록 쿼리를 재구성하고 다른 테이블 각각에 LEFT JOIN을 수행하여 쿼리를 통해 링크를 찾을 수 있어야합니다. 하나 또는 다른 테이블. 따라서 각 LEFT JOIN을 사용하면 GroupMembers 테이블을 한 번만 살펴볼 수 있습니다. 자, IF(). 그룹 구성원이 기초이므로 우리는 BOTH 테이블을 사용할 수 있고 링크되어 있으므로 한 테이블에서 다른 테이블에서 각각 열을 가져옵니다. 참조 용으로 "링크 유형"도 포함 시켰습니다. STRAIGHT_JOIN을 사용하면 엔진이 테이블을 결합하는 방법에 대한 해석을 변경하는 데 도움이됩니다.

SELECT STRAIGHT_JOIN 
     gm.linktype, 
     if(gm.linktype = "group", cg.grname, cm.contact_sur) ADat 
    from 
     groupmembers gm 
     left join contactgroups cg 
      ON gm.link_id = cg.id 
     left join contactmain cm 
      ON gm.link_id = cm.id 
+0

DRapp에 감사드립니다. 항상 희망이 있습니다. :) 또한 커뮤니티의 현명한 구성원입니다.) (나의 영어에 대해 유감스럽게 생각한다) –

1

contactgroups.id하면 groupmembers.id 동일해야 모르지만, 2 또한 반드시 동일한 경우 안드레와 위임되어야 'Comitee'결과에 누구인지 목록 싶습니다 중복되어 있으며 문제가있는 곳일 수도 있습니다. 그것은 당신이 그것을 작성한대로 잘 작동합니다 : http://ideone.com/7EGLZ 무엇인지 모르는 사이에 실제로 나는 더 이상 할 수 없습니다.

편집 : 나는 쉼표로 구분 FROM에 익숙 해요,하지만 정말 중요하지 않습니다, 그래서 당신은 다른 테이블에서 아무것도 선택하지 않기 때문에이 같은 결과를 제공합니다.