본문 바로가기
MySql

MySQL은 특정 결과를 배열로 그룹화합니다.

by 베이스 공부 2021. 1. 15.
반응형

여러 다른 테이블의 데이터를 결합하기 위해 여러 LEFT JOIN 이있는 복잡한 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)는 wp_usermeta 테이블에 'target_employer'인 meta_key 필드가있는 행이 두 개 이상있을 수 있습니다. 명확하지 않은 경우 행이 다음과 같이 보일 수 있습니다.

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
  }
}

최신 정보: @bpanulla : 여기 진짜 (간단하지 않은 쿼리)가 있습니다 ...

"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
";

 

해결 방법

 


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

기본적으로 target_employer_id 에서 쉼표로 구분 된 요소 목록을 가져와야합니다. PHP explode 함수를 사용하여 PHP 로직의 배열로 변환 할 수 있습니다.

 

참조 페이지 https://stackoverflow.com/questions/14060332

 

 

반응형

댓글