2012-12-27 5 views
6

여러 개의 다른 테이블의 데이터를 결합하기 위해 복수 LEFT JOIN의 복합 MySQL 쿼리를 작성하고 있습니다.MySQL 결과를 배열로 그룹화하십시오.

$public_query = 
"SELECT * FROM `wsat_ib` 
LEFT JOIN wp_usermeta ON wsat_ib.user_id = wp_usermeta.user_id 
LEFT JOIN wpjb_resume ON wsat_ib.user_id = wpjb_resume.user_id 
LEFT JOIN wpjb_field_value ON wpjb_resume.id=wpjb_field_value.job_id 
LEFT JOIN wpjb_application ON wpjb_application.user_id = wsat_ib.user_id 
WHERE wp_usermeta.meta_key = 'target_employer' 
AND wp_usermeta.meta_value = 'public' 
AND wpjb_resume.is_active =1 
"; 

내 문제 : 테이블 wp_usermeta이 같은 USER_ID에 대해 여러 행이있을 수 있습니다. 예를 들어 사용자 (user_id = 5)는 'target_employer'인 meta_key 필드가있는 wp_usermeta 테이블에 하나 이상의 행을 가질 수 있습니다. 확실하지 않은 경우 행이 다음과 같이 보일 수 있습니다.

id user_id meta_key   meta_value 
1  5   target_employer 13 
2  5   target_employer 53 
3  79   target_employer 21 

내 질문 : 내 결과 개체 중 하나의 배열로 wp_usermeta에서 각 일치하는 행을 반환 할 수있는 방법이 있나요? 그래서 var_dump()는 다음과 같이 보일 것이다 :

object(stdClass)#2906 (14) { 
    ["user_id"]=> 
    string(4) "5" 
    ["firstname"]=> 
    string(6) "Bilbo" 
    ["lastname"]=> 
    string(3) "Baggins" 
    ... 
    ["target_employer"]=> 
    array(2) { 
    [0]=>13, 
    [1]=>53 
    } 
} 

UPDATE : @bpanulla : 나는 MySQL의가 배열을 반환 할 수 있다고 생각하지 않습니다

"SELECT wsat_ib.user_id, wpjb_resume.firstname, wpjb_resume.lastname, wsat_ib.overall_score, wsat_ib.account_score, wsat_ib.econ_score, wsat_ib.math_score, wsat_ib.logic_score, wsat_ib.fsanaly_score, wsat_ib.corpval_score, wsat_ib.end_time, GROUP_CONCAT(wp_usermeta.meta_value) AS target_employers, wpjb_field_value.value AS school, wpjb_application.job_id 
FROM `wsat_ib` 
LEFT JOIN wp_usermeta ON wsat_ib.user_id = wp_usermeta.user_id 
LEFT JOIN wpjb_resume ON wsat_ib.user_id = wpjb_resume.user_id 
LEFT JOIN wpjb_field_value ON wpjb_resume.id=wpjb_field_value.job_id 
LEFT JOIN wpjb_application ON wpjb_application.user_id = wsat_ib.user_id AND wpjb_application.field_id=3 
WHERE (wp_usermeta.meta_key = 'target_employer' 
AND wp_usermeta.meta_value = 'public' 
AND wpjb_resume.is_active =1) 
GROUP BY user_id 
"; 
+0

"일치하는 각 행을 wp_usermeta에서 결과 개체 중 하나의 배열로 반환 할 수있는 방법이 있습니까?" 아닙니다. SQL은 결과 셀을 원자 적이어야합니다. 배열이 없습니다. user_id를 키로 사용하여 동일한 사용자의 값을 배열에 누적 할 수 있습니다. – user4035

+0

@ user4035 설명 된대로하는 방법을 보여줄 수 있습니까? 내가하고 싶은 것처럼 들리네. – emersonthis

답변

18

여기 진짜 (unsimplified 쿼리) ... 당신은 ELEM의 쉼표로 구분 된 목록을 얻어야한다 기본적으로

SELECT user_id, firstname, lastname, 
    GROUP_CONCAT(wp_usermeta.meta_value) as target_employer_id 
FROM `wsat_ib` 
    LEFT JOIN wp_usermeta ON 
     (wsat_ib.user_id = wp_usermeta.user_id 
      AND wp_usermeta.meta_key = 'target_employer') 
GROUP BY user_id, firstname, lastname 

: PHP는,하지만 GROUP_CONCAT aggregate function.이 같은 시도를 사용하여 구분 된 목록을 반환 할 수 있습니다 target_employer_id에 있습니다. PHP explode 함수를 사용하여 PHP 로직의 배열로 변환 할 수 있습니다.

+0

니스! 나는 이것이 효과가있을 것이라고 생각한다. 나는 그것을 시험해 볼 것입니다. – emersonthis

+0

나는 거의이 일을했지만, 나는 'GROUP BY'와 힘들어하고있다. 예상되는 행 수를 반환하지만 target_employer 필드에 여러 개의 중복이 나타나는 이유에 대해 혼란 스럽습니다. 대부분의 사용자는 대상 고용주가 하나 뿐이지 만 각 행에있는 1 ~ 12 개의 고용주 ID가 반환됩니다. 대부분 동일한 값의 반복이며 wp_usermeta 테이블에서 중복 키/값 쌍이 허용되지 않으므로 이상합니다. 어떤 충고? – emersonthis

+1

GROUP_CONCAT 함수는 이러한 경우에 도움이되는 몇 가지 추가 매개 변수를 사용합니다 (링크 된 문서 페이지 참조). 특히, 고유 한 목록을 얻으려면'GROUP_CONCAT (DISTINCT wp_usermeta.meta_value)'를 시도하십시오. 나는 당신이 믹스에 더 많은 테이블을 추가하고 조인에서 곱해진 행을 얻지 않는 한 중복이있을 것이라고 약간 의아해합니다. – bpanulla

관련 문제