2012-09-20 4 views
0
가입

나는 이전 게시물을 확인하고 어느 것도 도움이 세 테이블 (사용자, 일치, 면접)는 MySQL은 3 개 테이블

MYSQL 쿼리를 감상 할 수있다, 그러나 내 문제를 해결하지 않았다 지정된 경기에 대해 사용자 이름을 반환하고 인터뷰 번호가 있으면 # 면담하고 싶습니다.

하지만 인터뷰를 한 사용자에게만 결과를 제한하고 싶지는 않습니다. JOIN을 시도했지만 3 개의 테이블에서 작동하지 않습니다. 여기

내가 PHP에서 지금까지 무엇을 가지고 : 당신이 어떤 인터뷰와 사용자를 원하는 경우

$query = "SELECT CONCAT(u.first_name,' ',u.last_name,'----',COALESCE(i.v_code,'')) as name, u.id as id 
FROM #__users as u 

JOIN #__bl_match as m ON ((u.team_id = m.team1_id) OR 
    (u.team_id = m.team2_id) OR 
    (u.team_id = m.team3_id AND m.team3_id != 0) OR 
    (u.team_id = m.team4_id AND m.team4_id != 0) OR 
    (u.team_id = m.team5_id AND m.team5_id != 0) OR 
    (u.team_id = m.team6_id AND m.team6_id != 0) OR 
    (u.team_id = m.team7_id AND m.team7_id != 0) OR 
    (u.team_id = m.team8_id AND m.team8_id != 0) OR 
    (u.team_id = m.team9_id AND m.team9_id != 0) OR 
    (u.team_id = m.team10_id AND m.team10_id != 0)) 
    AND m.id = ".$t_id."AND m.id != 0 

JOIN #__bl_interview as i ON i.u_id = u.id"; 

     $db->setQuery($query); 
    $parti12 = $db->loadObjectList(); 
+3

LEFT JOIN을 (를) 사용해 보셨습니까? JOIN은 조인 테이블에 해당 엔티티가있는 사용자 만 가져옵니다. – Tool

+0

방금 ​​변경했습니다. 하지만 이제는 사용자 이름이 표시되지 않고 드롭 다운 상자에 공백 만 표시됩니다. – user1071915

+0

LEFT JOIN을 #__bl_match 테이블에 추가해보십시오. – Tool

답변

0

것은, 당신이 LEFT 인터뷰 테이블에 가입 사용해야합니다,하지만 면접 번호를 의미합니다 그 사용자는 NULL이됩니다.

숫자를 SELECT 목록의 사용자 이름과 연결하므로 인터럽트가 없으면 NULL 값으로 문자열을 연결 한 이후 사용자 이름이 NULL로 반환됩니다. NULL 값에 대한 다른 모든 연산은 NULL 결과를 생성합니다.

이 문제를 방지하려면 i.v_code이 NULL 일 때 대소 문자를 처리해야합니다. 전형적인 방법은 MySQL의에서 COALESCE function 함께 그렇게하기 : 당신이 이름을 적용하고있는 서식을 제공

이제
SELECT CONCAT(u.first_name, ' ', u.last_name, '----', COALESCE(i.v_code,'')) as name, 
     u.id as id 
FROM #__users as u 
JOIN #__bl_match as m ON ((u.team_id = m.team1_id) OR 
    (u.team_id = m.team2_id) OR 
    (u.team_id = m.team3_id AND m.team3_id != 0) OR 
    (u.team_id = m.team4_id AND m.team4_id != 0) OR 
    (u.team_id = m.team5_id AND m.team5_id != 0) OR 
    (u.team_id = m.team6_id AND m.team6_id != 0) OR 
    (u.team_id = m.team7_id AND m.team7_id != 0) OR 
    (u.team_id = m.team8_id AND m.team8_id != 0) OR 
    (u.team_id = m.team9_id AND m.team9_id != 0) OR 
    (u.team_id = m.team10_id AND m.team10_id != 0)) 
    AND m.id = ".$t_id."AND m.id != 0 
LEFT JOIN #__bl_interview as i ON i.u_id = u.id" 

는, 당신은 어떤 후속 인터뷰 코드 이름 후 외부 로 남아있을 수 있습니다. 당신이를 방지하려는 경우, 우리는과 같이, 우리의 출력이 조금 더 똑똑 대신에 COALESCE의 IF을 사용할 수 있습니다 : 그것은 무엇을하고 있는지

SELECT CONCAT(u.first_name, ' ', u.last_name, IF(i.v_code, '---- ' + i.v_code, '')) as name 

참고 : i.v_code이 NULL이 아닌 경우, 첫 번째 표현식을에 IF가 true로 평가되므로 두 번째 표현식이 반환됩니다. 그렇지 않으면 세 번째 표현식 (빈 문자열)이 반환되므로 i.v_code이 NULL이면 사용자 이름 만 출력됩니다.