2010-04-27 2 views
0

공통 ID를 공유하는 한 두 개의 개별 테이블에서 모든 필드를 선택하려고합니다.두 테이블에서 MySQL 쿼리를 가져오고 올바른 필드에 표시

//mysql query 
$result = mysql_query("SELECT * FROM project, links 
WHERE project.id = links.id and project.id = $clientID") 

//displaying the link 
if ($row['url'] != null){ 
    echo "<div class='clientsection' id='links'>Links</div>"; 
    echo "<a class='clientlink' id='link1' href='" . $row['url'] . "'>" . $row['name'] . "</a>"; 
} 
else { 
echo "<a class='clientlink' id='link1' href='" . $row['url'] . "' style='display:none;'>" . $row['name'] . "</a>"; 
     }; 

내 테이블은 "프로젝트"이고 "링크"는 각각 참조 용으로 "id"라는 공통 필드를 공유합니다. links.id and project.id이 같은지 보입니다. 아무 것도 출력하지만, $clientID과 연결된 links.id이없는 경우 $ clientID에 상대적인 컨테이너가 전혀 표시되지 않습니다.

기본적으로이 CMS의 특정 클라이언트에 링크를 동적으로 추가하기 위해이 링크를 사용하고 있으며 링크가 없으면 컨테이너가 나타나기를 원합니다.

희망을 갖고 명확하게 표현 했으므로 올바른 방향으로 어떤 포인터라도 감사 할 것입니다. 감사!

답변

5

SQL ANSI 명시 적 조인 구문을 사용하면 암시 적 조인에서 수행중인 INNER JOIN이 아니라 LEFT OUTER JOIN을 지정할 수 있습니다.

일치 합류 테이블의 행이없는 경우에도 LEFT OUTER은 첫 번째 테이블에서 결과를 반환 가입 : 링크 테이블에 일치하는 ID가, links.id는 것입니다 행의 경우

SELECT * FROM project 
LEFT OUTER JOIN links 
ON links.id = project.id 
WHERE project.id = $clientID 

NULL이되어야합니다.

편집

당신이 자동 증가 기본 키 links.linkid이 순서를 지정합니다, 당신이 자신을 할 수있는 단지 첫 번째 링크를 원하는 경우는 다음과 같이 조인

SELECT * FROM project 
LEFT OUTER JOIN links 
ON links.id = project.id 
LEFT OUTER JOIN links l2 
ON l2.id = project.id AND l2.linkid < links.linkid 
WHERE project.id = $clientID AND l2.id IS NULL 

이가하는 일 linkid가 더 작은 모든 링크 테이블 행에서 조인 된 다음 WHERE 절에서 해당 행을 제외시킵니다. 결국 더 작은 linkid가없는 행만 남게되고 결국 각 프로젝트의 linkid가 가장 작은 링크가됩니다.

+0

답변을 주신 Marcus에게 고맙겠습니다.하지만 해결해야 할 부분이 있습니다. 이제 올바른 컨테이너를 열지 만 하나 이상의 링크가있는 개별 클라이언트 ID에서 여러 컨테이너를 표시합니다. 하나는 첫 번째 링크를 표시하고 다른 하나는 후속 링크 –

+0

@Matt에서 생성 된 컨테이너입니다. 링크의 순서를 지정하는 링크 테이블의 "첫 번째"링크를 찾으십시오. –

+0

분명히 주문 된 linkid라는 기본 키가 있습니다. –

1

"INNER JOIN"쿼리는 본질적으로 두 테이블에 일치하는 ID가있는 레코드 만 반환합니다. Marcus의 예처럼 "LEFT OUTER JOIN"을하면 찾고있는 결과를 반환합니다.

관련 문제