我正在编写一个复杂的 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 聚合函数返回一个分隔列表。尝试如下:
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 逻辑中的数组。
从 MySQL 8 和 MariaDB 10.5 开始,还可以使用
JSON_ARRAYAGG()
和 JSON_OBJECTAGG()
,然后将结果字符串解码为 JSON 服务器端。
尤其是
JSON_OBJECTAGG
可以被视为 GROUP_CONCAT()
的更高级替代品(请参阅 文档)。