2010-11-03 14 views
11

Tengo una tabla "exercise_results". Las personas ponen sus resultados al principio y luego dos meses más tarde ponen sus resultados para ver cuánto mejoraron. Su conjunto inicial tiene el exercise_type_id de "1" y el conjunto final tiene el exercise_type_id de "2".¿Cómo combino dos filas de MySQL en una y las visualizo en una tabla usando PHP?

necesito una forma de mostrar esto en una tabla HTML que se ve así:

Normally I do this using

un bucle foreach, pero eso es con filas individuales. Tengo problemas para combinar dos filas en una. Creo que esto puede ser tan simple como algún tipo de combinación de MySQL? Identificamos a cada persona por su person_unique_id.

Éstos son mis campos:

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

filas de la muestra:

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 

que he probado algunas soluciones, pero estoy perdido. Cualquier ayuda sería genial. ¡Gracias!

EDIT:

En respuesta al comentario de abajo, yo esperaría para algunos datos como:

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

¿Se ha corregido la base de datos? Quiero decir, ¿podrías cambiar las tablas? –

+0

No realmente. Ya hay una gran cantidad de datos en las tablas que se utilizan en una aplicación de producción. – Michael

+0

Puede hacer esto con la consulta agrupando por id y seleccionando MAX (IF (exercise_type_id = 1, mile_running_time, '')) AS 'Start', MAX (IF (exercise_type_id = 2, mile_running_time, '')) AS 'End 'etc ... puede ser un poco desafiante, pero solo tenía que hacer este tipo de resumen. – methodin

Respuesta

17

Usted puede utilizar GROUP_CONCAT() para conseguir un dos filas resultado como este:

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 

Su resultado será como:

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

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

Y entonces usted puede utilizar php explotar con los campos de resultados para obtener los resultados para cada tipo.

+0

Eso funciona para mí. ¡Gracias! – Michael

+0

Es bueno tener una solución tan simple, pero es muy restrictiva. Esto no funcionará si, por ejemplo, tiene campos con comas (o si MySQL admite comas como marcas decimales). Al menos use un carácter menos común como la tubería: | – theazureshadow

+0

Puede especificar el separador que desea en su group_concat de la siguiente manera: 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); 

por lo que he entendido

edición:

intente esto

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

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

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


} 

print_r($rows); 
+0

¿Este código no crearía dos filas en la tabla HTML para cada persona? La primera fila con sus datos BEGIN y la segunda fila con su END? – Michael

+0

Intenté que tu idea funcionara, pero estaba teniendo dificultades. Creo que el problema estaba en mi consulta. Gracias. – Michael

0

Extraiga toda la tabla, o las filas que le interesen, ordene la identificación de persona, compare la identificación de persona de cada fila con la siguiente para ver si hay un resultado para imprimir para todas las columnas de la tabla HTML. Si no, salta a la siguiente y deja los campos en blanco (o alguna otra solución, tal vez ignores a las personas que no completaron ambos campos).

Mis habilidades de PHP son limitadas, por lo que no hay un ejemplo de código.

+0

Gracias por la idea. – Michael

0

Si ordena en person_unique_id y luego exercise_type_id, puede hacerlo. Si tiene dos filas para todo el mundo, se puede dejar de lado el caso de (sólo usar la otra persona):

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

Gracias por la información. Parece que funcionaría. – Michael

Cuestiones relacionadas