php - MySQL 将某些结果分组到一个数组中

标签 php mysql join left-join

我正在编写一个复杂的 MySQL 查询,其中包含多个 LEFT JOIN 以合并来自多个不同表的数据。

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

更新: @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
";

最佳答案

我不认为 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

默认情况下,您应该在 target_employer_id 中获得以逗号分隔的元素列表。您可以使用 PHP explode 函数将其转换为 PHP 逻辑中的数组。

关于php - MySQL 将某些结果分组到一个数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14060332/

相关文章:

PHP - 如何确定请求是否来自特定文件

php - 使用 Android Studio、MySQL 和 php 文件,在何处以及如何保存 JSON 响应类型

mysql - 获取 LEFT JOIN 中共同好友的数量

java - JPA/JPQL JOIN 子选择/子查询

php - 在 Ubuntu 上建立 PHP 客户端和 C 服务器之间的 TCP 套接字连接

php - 如何在一页中显示来自不同数据库表的数据

Javascript AJAX PHP if 语句不起作用

mysql - 使用来自单独表的 JOIN 过滤选项并显示结果

java - 执行 JDBC 事务时出现重复键异常

mySQL相关子查询