I'm writing a complex MySQL query with multiple LEFT JOIN
s to combine data from several different tables.
$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
";
My problem: The table wp_usermeta can have multiple rows for the same user_id. For example a user (with user_id = 5) may have more then one row in the table wp_usermeta with the field: meta_key that is 'target_employer'. In case that's not clear, the rows might look like this.
id user_id meta_key meta_value
1 5 target_employer 13
2 5 target_employer 53
3 79 target_employer 21
My Question: Is there any way that I can return each matching row from wp_usermeta as an array in one of my result objects? So the var_dump()
would look something like this:
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: Here's the real (unsimplified query)...
"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
";
The MySQL GROUP BY Statement The GROUP BY statement groups rows that have the same values into summary rows, like "find the number of customers in each country". The GROUP BY statement is often used with aggregate functions ( COUNT() , MAX() , MIN() , SUM() , AVG() ) to group the result-set by one or more columns.
Starting with MySQL 8.0. 1, the server supports the SQL GROUPING function. The GROUPING function is used to distinguish between a NULL representing the set of all values in a super-aggregate row (produced by a ROLLUP operation) from a NULL in a regular row.
We can use array element in the WHERE clause as the condition to filter the rows.
I don't think MySQL can return an array to PHP, but it can return a delimited list using the GROUP_CONCAT aggregate function. Try something like:
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
By default you should get a comma-separated list of elements in target_employer_id
. You can use the PHP explode
function to turn that into an array in your PHP logic.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With