2012-12-27 43 views
6

我正在编写一个复杂的MySQL查询,并使用多个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中具有多于一行,而字段meta_key是'target_employer'。如果不清楚,行可能看起来像这样。

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:这里是真正的(查询繁体字)...

"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

我不认为MySQL能够返回数组PHP,但它可以使用GROUP_CONCAT aggregate function.试着这么做返回分隔列表:

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 

默认情况下,你应该得到一个逗号分隔ELEM列表请致电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