Как объединить две строки MySQL в один и отобразить их в таблице с помощью PHP?

У меня есть таблица "exercise_results". Люди положили свои результаты в начале, а затем через два месяца поставили свои результаты, чтобы увидеть, насколько они улучшились. Их начальный набор имеет упражнение_type_id из "1", а в конце набор имеет значение exercise_type_id "2".

Мне нужен способ показать это в таблице HTML, которая выглядит так:

Обычно я делаю это с помощью

цикл foreach, но с одиночными строками. У меня возникли проблемы с объединением двух строк в один. Я думаю, что это может быть так просто, как присоединение к MySQL? Мы идентифицируем каждого человека по их личности_unique_id.

Вот мои поля:

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

Примеры строк:

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

Я пробовал несколько решений, но я потерялся. Любая помощь будет большой. Спасибо!

EDIT:

В ответ на комментарий ниже я надеюсь, что для некоторых данных, таких как:

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'

Ответ 1

Вы можете использовать GROUP_CONCAT(), чтобы получить результат в виде двух строк:

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

Ваш результат будет таким:

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

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

И затем вы можете использовать php explode с полями результата, чтобы получить результаты для каждого типа.

Ответ 2

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

из того, что я понял

изменить:

попробуйте это

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

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

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


 }

 print_r($rows);

Ответ 3

Извлеките всю таблицу, или какие строки вам интересны, сортируйте идентификатор личности, сравните идентификатор личности каждой строки со следующей, чтобы увидеть, есть ли результат для печати для всех столбцов в вашей таблице HTML. Если нет, перейдите к следующему и оставьте поля пустыми (или какое-то другое решение, возможно, игнорируете лиц, которые не заполнили оба поля?).

Мои навыки PHP ограничены, поэтому нет примера кода.

Ответ 4

Если вы заказываете person_unique_id, тогда exercise_type_id, вы можете сделать это. Если у вас есть две строки для всех, вы можете оставить if (используйте только else):

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
}