2014-11-06 4 views
2

다음 표가 있는데 그 중 하나 이상의 요소를 쿼리하고 싶습니다.SQL 쿼리 JOIN 구문

categories table ->idcat(int), cat(varchar); 
topics table  ->idtopic(int), topic(varchar), idcat(int-fk), iduser(int-fk); 
replies table ->idreply(int), reply(varchar) iduser(int-fk), idtopic(int-fk) 
users table  ->iduser(int), username(varchar). 

현재 쿼리는;

$query = "SELECT t.topic, t.idtopic, u.username 
    FROM topics t 
    LEFT JOIN categories c ON t.idcat = c.idcat 
    LEFT JOIN users u ON t.iduser = u.iduser 
    WHERE c.idcat = '" . $idcat . "'"; 

'주제'및 '사용자 이름'이 표시됩니다. 'idReply'를 표시하고 싶지만 적절한 JOIN 구문을 모르겠습니다.

+1

각 주제에 대해 '답장'에 여러 입력란이 없습니까? –

+0

이 테이블 구조가있을 수 있다고 생각합니다. 따라서 새로운 조인으로 여러 행을 반환 할 가능성이 있습니다. – Henry

답변

0

topics 테이블에 reply_id (외래 키)이 있어야합니다. 그 후에이 쿼리를 사용할 수 있습니다.

$query = "SELECT t.topic, t.idtopic, u.username, r.id as reply_id 
      FROM topics t 
      LEFT JOIN categories c ON t.idcat = c.idcat 
      LEFT JOIN users u ON t.iduser = u.iduser 
      LEFT JOIN replies r ON t.reply_id = r.id 
      WHERE c.idcat = '" . $idcat . "'"; 
+0

그건 기술적 인 의미에서 작동 할 수도 있지만, 그것이 OP를 도울 것이라고는 생각하지 않습니다. 각 주제에 대해 여러 개의 답을 필요로하거나 원하는 것처럼 보이기 때문에 답장 테이블에 fk를 추가하고 다음과 같이 참여하는 것이 좋습니다. 'LEFT JOIN replies r ON r.idtopic = t.idtopic' – mason81

+1

주제 테이블에 대한'reply_id'는 주제와 응답 사이에 1 : 1 관계를 시행합니다. 이것은 실제로 필요한 것일 수 있습니다. 이 경우라면'reply_id'가 적합 할 것입니다. 그렇지 않으면 내 답변을보십시오. – Henry

1
SELECT 
    t.topic, 
    t.idtopic, 
    u.username 
FROM 
    topics t 
LEFT JOIN 
    categories c ON t.idcat = c.idcat 
LEFT JOIN 
    users u ON t.iduser = u.iduser 
LEFT JOIN // new 
    replies r ON r.iduser = u.iduser AND r.idtopic = t.idtopic // new 
WHERE c.idcat = '" . $idcat . "'"; 

이 지정된 카테고리에있는 모든 주제에 대한 모든 응답에 대한 행을 생성합니다. 어느 것이 많은 기록 일 수 있습니다.

원하는 결과를 얻으려면 응답 테이블에서 정확한 조인 유형을 시험해 보는 것이 좋습니다. LEFT JOIN은 주어진 주제에 대한 답장이 없을 경우 여전히 결과를 얻으므로 정확할 것입니다. 이것은 SQL의 취향에 달려 있습니다.

OUTER JOIN & LEFT OUTER JOIN이 있습니다.

INNER JOIN을 사용하면 답장이있는 항목 만 반환됩니다.

+0

아마도'r.idreply, r.reply'를 select 절에 추가하겠습니까? – mason81

+1

유용 할 수도 있습니다. 이 조인과 함께 4 개 테이블의 필드를 추가 할 수 있습니다. – Henry