2013-01-30 2 views
2

저는 하루 종일이 문제에 대한 내 머리를 긁어 왔고 간단합니다. SQL 결합을 시도하고 사용하려고 시도한 것은 이번이 처음 이었지만, 기본 지식을 배우는 동안 고급 기술에 좀 더 집중하고 있습니다.MySQL이 조인 테이블에 합류합니다

기본적으로 나는 자체 포럼을 만들고 있으며 두 개의 테이블이 있습니다. f_topics (스레드) 및 f_groups (포럼 또는 범주). f_topics의 topicBase와 f_groups의 groupID 사이에는 관계가 있으며, 이는 각 주제가 어느 그룹에 속하는지를 보여줍니다. 각 주제에는 topicID라는 고유 한 ID가 있고 groupID라는 그룹에 대해서도 동일합니다.

기본적으로이 모든 열을 단일 SELECT 문으로 가져 오려고합니다. 주제의 제목, 주제가 게시 된 날짜, 주제가 속한 그룹의 ID 및 해당 그룹의 이름 . 이 항목은 그룹 ID 2에있는 경우에도 내가 사용하려고했지만, 그룹은 항상 다시 1로 오는 것입니다 :

내 전체 로직이 경우이 훨씬 이해하고 있지 않은 경우
$query=mysqli_query($link, " 

SELECT `topicName`, `topicDate`, `groupName`, `groupID` 
FROM `f_topics` 
NATURAL JOIN `f_groups` 
WHERE `f_topics`.`topicID`='$tid'; 


") or die("Failed to get topic detail E: ".mysqli_error()); 
var_dump(mysqli_fetch_assoc($query)); 

죄송합니다 완전히 틀린 경우, 대체 방법을 제안 할 수 있습니까?

읽어 주셔서 감사합니다.

답변

2

테이블을 조인하려면 외래 키를 매핑해야합니다. groupID 필드가 그룹 테이블을 가정하면, 이것은 당신이 그들과 합류 줄 방법은 다음과 같습니다

나는 f_groups 테이블에서 그룹 ID 열을 참조 "topicBase"라는 f_topics의 열이 모이는 것과 그래서
SELECT `topicName`, `topicDate`, `groupName`, `groupID` 
FROM `f_topics` 
LEFT JOIN `f_groups` 
ON `f_topics`.`groupID` = `f_groups`.`groupID` 
WHERE`f_topics`.`topicID`='$tid'; 
+0

대신에 "... FROM'f_groups' LEFT JOIN'f_topics' ... 대신'? –

+0

나는 질문의 요구 사항에 따라 그렇게 믿지 않는다. – AlienWebguy

+0

나는 주제가 한 그룹에 속하는지, 다른 방법이 아닌지에 관한 질문으로부터 모은다. 왼쪽 결합을 제안하면, 존재하지 않는 그룹에 속하거나 전혀 그룹에 속하지 않을 수도 있다고 가정하는 것입니다. 그래? –

0

.

이러한 가정을 토대로 INNER JOIN 또는 LEFT JOIN을 수행 할 수 있습니다. INNER는 LEFT가 f_topics의 데이터 만 필요로하는 반면 두 테이블 모두에 항목이 있어야합니다. 당신이 NATURAL JOIN을 피하기

SELECT 
    f_topics.topicName, 
    f_topics.topicDate 
    f_groups.groupName 
    f_groups.groupID 
FROM 
    f_topics 
INNER JOIN 
    f_groups 
    ON 
    f_topics.topicBase = f_groups.groupID 
WHERE 
    f_topics.topicID = '$tid' 
0

나는 좋습니다.

주로 참조 된 테이블에서 다른 참조 된 테이블의 열 이름과 일치하는 새 열을 추가하여 작동중인 쿼리가 손상 될 수 있기 때문입니다.

두 번째로, 두 테이블 모두를 신중하게 검토하지 않고도 어느 열이 어느 열과 일치하는지 SQL 판독기 (검토 자)에게 알립니다. 누군가가 쿼리를 끊었다 열을 추가 한 경우 (그리고, 그것이 더욱 어렵게 열이 추가되기 전에이 될하는 데 사용되는 기준을 가입 알아낼 수 있습니다. 대신


, 난 당신을 추천합니다 ON 절에있는 조건에서 열 이름을 지정합니다.

을 그것은, 바람직하게는 짧은 테이블 별칭을 테이블 이름으로 모든 열 참조를 자격, 또는도 좋은 방법입니다. 간단 문의 경우

을, 나는 이것이 수 있음에 동의합니다 불필요한 오버 헤드처럼 보일 수 있습니다.하지만 명령문이 더 복잡해지면이 패턴은 s의 가독성을 대폭 향상시킵니다. tatement.

두 테이블의 정의가 없으면 전제 조건을 만들어야하며 두 테이블 모두에 groupID 열이 있다는 것을 추측해야합니다.이 테이블은 같은 이름의 유일한 열입니다 .그러나 f_topics에있는 topicBase 열이 groupIDf_groups에 일치한다고 지정했습니다. (그리고 자연은 그런을받지 않습니다 가입하세요.)

내가 원하는 결과 집합이 쿼리에 의해 반환 될 것이라고 생각 : 그것의 가능한 경우 topicBase 열이 NULL로 또는 포함하는

SELECT t.`topicName` 
    , t.`topicDate` 
    , g.`groupName` 
    , g.`groupID` 
    FROM `f_topics` t 
    JOIN `f_groups` g 
    ON g.`groupID` = t.`topicBase` 
WHERE t.`topicID`='$tid'; 

을 f_groups.GroupID 값과 일치하지 않는 값이고 f_group의 열이 NULL로 반환되는 항목을 반환하려는 경우 (일치하는 항목이없는 경우) 외부 조인을 사용하여 값을 가져올 수 있습니다.

해당 동작을 얻으려면 위 쿼리에서 JOIN 키워드 바로 앞에 LEFT 키워드를 추가하십시오.

관련 문제