2010-11-03 14 views
11

Ho una tabella "exercise_results". Le persone hanno inserito i loro risultati all'inizio e poi due mesi dopo hanno inserito i loro risultati per vedere quanto hanno migliorato. Il loro set iniziale ha l'esercizio_type_id di "1" e il set finale ha l'esercizio_type_id di "2".Come unire due file MySQL in uno e visualizzarli in una tabella utilizzando PHP?

Ho bisogno di un modo per visualizzare questo fuori in una tabella HTML che assomiglia a questo:

Normally I do this using

un ciclo foreach, ma questo è con le singole righe. Ho problemi a combinare due righe in una. Penso che questo possa essere semplice come una sorta di join MySQL? Identifichiamo ogni persona dal suo person_unique_id.

Qui sono i miei campi:

id | person_unique_id | person_name | exercise_type_id | mile_running_time | bench_press_weight_lbs | squat_weight_lbs | date_of_exercise_performed 

righe di esempio:

1 | J123 | John Smith | 1 | 8 | 200 | 300 | 2010-03-20 
2 | J123 | John Smith | 2 | 7 | 250 | 400 | 2010-05-20 
3 | X584 | Jane Doe | 1 | 10 | 100 | 200 | 2010-03-20 
4 | X584 | Jane Doe | 2 | 8 | 150 | 220 | 2010-05-20 

che ho provato un paio di soluzioni, ma mi sono perso. Qualsiasi aiuto sarebbe grande. Grazie!

EDIT:

In risposta al commento qui sotto, mi auguro per alcuni dati come:

array 0 => 
array 
    'Exercise' => 
    array 
     'person_unique_id' => string 'J123' 
     'person_name' => string 'John Smith' 
     'begin_mile_running_time' => string '8' 
     'end_mile_running_time' => string '7' 
1 => 
array 
    'Exercise' => 
    array 
     'person_unique_id' => string 'X584' 
     'person_name' => string 'Jane Doe' 
     'begin_mile_running_time' => string '10' 
     'end_mile_running_time' => string '8' 
+0

Il database è stato riparato? Voglio dire, potresti cambiare i tavoli? –

+0

Non proprio. Vi sono già molti dati nelle tabelle utilizzate in un'applicazione di produzione. – Michael

+0

Puoi farlo con la query raggruppando per id e selezionando MAX (IF (exercise_type_id = 1, mile_running_time, '')) AS 'Start', MAX (IF (exercise_type_id = 2, mile_running_time, '')) AS 'Fine 'ecc ... può essere un po' impegnativo, ma ho solo dovuto fare questo tipo di rollup. – methodin

risposta

17

È possibile utilizzare group_concat() per ottenere un due file risultato come questo:

SELECT person_unique_id, person_name, 
     group_concat(mile_running_time) AS miles, 
     group_concat(bench_press_weight_lbs) AS bench, 
     GROUP_CONCAT(squat_weight_lbs) AS squat 
FROM exercise_result 
GROUP BY person_unique_id 

il risultato sarà come:

J123 | John Smith | 8,7 | 200,250 | 300,400 

X584 | Jane Doe | 10,8 | 100,150 | 200,220 

E poi si può usare php esplodere con i campi dei risultati per ottenere i risultati di ogni tipo.

+0

Questo funziona per me. Grazie! – Michael

+0

È bello avere una soluzione così semplice, ma è molto restrittiva. Questo non funzionerà se, ad esempio, hai campi con virgole (o se MySQL supporta le virgole come decimali?). Almeno usa un carattere meno comune come il pipe: | – theazureshadow

+0

Puoi specificare il separatore che vuoi nel tuo group_concat in questo modo: group_concat (mile_running_time SEPARATOR '#') – layalk

0
$query = mysql_query("select ...your data"); 

while ($row = mysql_fetch_assoc ($query)) { 
    if ($row['exercise_type_id']==1) 
     $exe1[]=$row; 
    else 
     $exe2[]=$row; 


} 

print_r($exe1); 
print_r($exe2); 

da quello che ho capito

edit:

prova questo

$query = mysql_query("select ...your data"); 

while ($row = mysql_fetch_assoc ($query)) { 

    $rows[]=array('Exercise'=>$row); 


} 

print_r($rows); 
+0

Questo codice non crea due righe nella tabella HTML per ogni persona? La prima riga con i loro dati BEGIN e la seconda riga con la loro FINE? – Michael

+0

Ho cercato di far funzionare la tua idea, ma ho avuto delle difficoltà. Penso che il problema fosse nella mia domanda. Grazie. – Michael

0

Estrai l'intera tabella, o qualsiasi riga ti interessa, ordina l'ID della persona, confronta l'ID della persona di ogni riga con la successiva per vedere se c'è un risultato da stampare per tutte le colonne nella tabella HTML. In caso contrario, passare a quello successivo e lasciare i campi vuoti (o qualche altra soluzione, magari ignorare le persone che non hanno compilato entrambi i campi?).

Le mie competenze PHP sono limitate, quindi nessun esempio di codice.

+0

Grazie per l'idea. – Michael

0

Se si ordina su person_unique_id quindi exercise_type_id, è possibile farlo. Se si dispone di due file per tutti, è possibile lasciare il se (solo utilizzare il resto):

for($i = 0; $i < count($exercise_results); $i++) 
{ 
    $first = $exercise_results[$i]; 
    if(!isset($exercise_results[$i+1]) 
     || $first['person_unique_id'] != $exercise_results[$i+1]['person_unique_id') { 
    $second = array(
     'person_name'=>$other['person_name'], 
     'mile_running_time' => null // fill in the rest with defaults (like null) 
    ); 
    } else { 
    $second = $exercise_results[$i+1]; 
    $i++; // skip ahead one, since you've already used the second result. 
    } 
    // perform your normal printing, but use $beginning and $end to get the respective results 
} 
+0

Grazie per le informazioni. Sembra che funzionerebbe. – Michael