2012-12-27 11 views
6

Sto scrivendo una query MySQL complessa con più LEFT JOIN s per combinare i dati da diverse tabelle diverse.MySQL raggruppa determinati risultati in un array

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

Il mio problema: La wp_usermeta tabella può avere più righe per lo stesso user_id. Ad esempio un utente (con user_id = 5) può avere più di una riga nella tabella wp_usermeta con il campo: meta_key che è 'target_employer'. Nel caso in cui non è chiaro, le righe potrebbero apparire come questo.

id user_id meta_key   meta_value 
1  5   target_employer 13 
2  5   target_employer 53 
3  79   target_employer 21 

mia domanda: C'è un modo che io possa tornare ogni riga corrispondente da wp_usermeta come una matrice in uno dei miei oggetti risultato? Così il var_dump() sarebbe simile a questa:

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: Ecco il vero e proprio (query non semplificata) ...

"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

"C'è un modo in cui posso restituire ogni riga corrispondente da wp_usermeta come una matrice in uno dei miei oggetti risultato?" No, SQL richiede che le celle dei risultati siano atomiche. Nessun array. È possibile accumulare i valori per lo stesso utente in una matrice, utilizzando user_id come chiave. – user4035

+0

@ user4035 Puoi fare un esempio su come fare ciò che hai descritto? Sembra quello che voglio fare. – emersonthis

risposta

18

Non credo che MySQL può restituire una matrice di PHP, ma può restituire un elenco delimitato utilizzando il GROUP_CONCAT aggregate function. provare qualcosa di simile:

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 

Per impostazione predefinita si dovrebbe ottenere un elenco separato da virgole di elem ents in target_employer_id. Puoi usare la funzione PHP explode per trasformarla in un array nella tua logica PHP.

+0

Bello! Penso che questo funzionerà. Ho intenzione di fare un tentativo. – emersonthis

+0

Ho quasi funzionato, ma ho difficoltà con 'GROUP BY'. Ricevo il numero previsto di righe restituite, ma sono confuso dal motivo per cui ottengo più duplicati nel campo target_employer. Anche se la maggior parte dei miei utenti ha un solo datore di lavoro target, vedo da qualche parte tra 1 e 12 id datore di lavoro in ogni riga restituita. La maggior parte sono ripetizioni dello stesso valore, il che è strano perché coppie di chiavi/valori duplicate non sono * permesse * nella tabella wp_usermeta. Qualche consiglio? – emersonthis

+1

La funzione GROUP_CONCAT richiede alcuni parametri aggiuntivi che possono essere d'aiuto in casi come questi (vedere la pagina doc collegata). In particolare, prova 'GROUP_CONCAT (DISTINCT wp_usermeta.meta_value)' per ottenere un elenco univoco. Sono un po 'perplesso sul fatto che ci sarebbero dei duplicati, a meno che tu non abbia aggiunto più tavoli al mix e stiano ottenendo file moltiplicate dai join. – bpanulla

Problemi correlati