Собрать данные из двух таблиц mysql

176
01 августа 2018, 09:30

Есть две таблицы. Первая таблица студентов с личными данными. Вторая таблица с оплатами. Оплат есть несколько по каждому студенту.

Задача: Вывести всех студентов(из таблицы с личными данными) и инфо(из таблицы с оплатами) по внесенным каждым оплаты. Необходимо собрать данные из двух таблиц.

таблица с данными:
students
| id_stud | fio     |
|       1 | Ivaov   |
|       2 | Petrov  |
|       3 | Sidorov |
таблица с оплатами:
payments
| id_payment | id_student | amount |
|          1 |          1 |     20 |
|          2 |          1 |     30 |
|          3 |          2 |     10 |
|          4 |          2 |     10 |
|          5 |          3 |     40 |
Ожидаемый результат:
1| Ivaov   | 20 |
           | 30 |
2| Petrov  | 10 |
           | 10 |
3| Sidorov | 40 |

Делаю так:

<table>
  <tr>
    <th>Is</th>
    <th>Fio</th>
    <th>Pago</th>
 </tr>
<?php
  $result = mysql_query(" SELECT * FROM students
  INNER JOIN payment ON students.id_stud = payment.id_student");
  $myrow = mysql_fetch_array($result);
  do{
    print"<tr>
          <td> $myrow[id_stud]</td>
          <td> $myrow[fio]</td>
          <td> $myrow[amount] </td>
          </tr>";                       
                    }
while($myrow = mysql_fetch_array($result));                 
?>
</table>

Но выводит каждого студента столько раз сколько было оплат в таблице payments. Помогите разобраться.

Answer 1

Примерный вариант:

 <?php
    //выборка из базы данных
    $list = array();
    $result = query("SELECT id_stud, fio, FROM students");
    while($data = mysqli_fetch_assoc($result)){ 
        $result2 = query("SELECT id_payment, amount FROM payments WHERE id=".$data['id_stud']);
        $list2=array();
        if($data['id_stud']!=NULL){
        while($pay = mysqli_fetch_assoc($result2)){ 
            $list2[]=array(
                  'id_payment'=>$pay['id_payment'],
                  'amount'=>$pay['amount'],
              );
        }
       }
        $list[]=array(
            'id_stud'=>$data['id_stud'],
            'fio'=>$data['fio'],
            'pay'=>$list2
        );
    }
    //перебор массива и вывод данных.
    foreach ($list as $key => $row) {
        echo  $row['id_stud'];
        echo $row['fio'];
        foreach ($list2 as $key_m => $col) {
            echo $row['pay'][$key_m]['id_payment'];
            echo $row['pay'][$key_m]['amount'];
        }
    }
    ?>
Answer 2

Вариант 1. Запрос изменить немного, используя GROUP_CONCAT(payments.sample_number) AS amounts. В итоге в каждой строке будет что-то такое 1| Ivaov | 20, 30 - все amount будут объединены через запятую, а если только один amount, то запятой ну будет. На стороне php потом можно сделать explode() по запятой.

Замечу, что если у студента нет оплат, то ваш запрос пропустит такого студента, т.к. для него не будет записей в таблице оплат. Чтобы исправить, нужно использовать RIGHT OUTER JOIN.

Вариант 2. Делать if и т.п., как советуют в комментарии.

Вариант 3. Делать перебор всех полученных значений из БД, собирая новый многомерный массив - такой, как нужно. Примерно вот так (но лучше тогда собирать все это на стороне sql - смотри первый вариант) и сразу выводить

$new_arr = [];
while($myrow = mysql_fetch_array($result)) {
    $id_stud = $myrow['id_stud'];
    $new_arr[$id_stud]['name'] = $myrow['fio'];
    $new_arr[$id_stud]['payments'][] = $myrow['amount'];
}
print_r($new_arr);

Вывести в таблицу можно примерно вот так. printf использовать не обязательно. выводите хоть с echo. А implode() объединяет все элементы массива через запятую в одну строку.

foreach($new_arr as $key => $value ) {
    printf("
        <tr>
            <th>%s</th>
            <th>%s</th>
            <th>%s</th>
         </tr>
    ", 
        $value['id_stud'],
        $value['name'],
        implode($value['payments'], ', ')
    );
}

через echo

foreach($new_arr as $key => $value ) {
    echo "
        <tr>
            <th>$value['id_stud']</th>
            <th>$value['name']</th>
            <th>implode($value['payments'], ",\n")</th>
         </tr>
    ";
}
READ ALSO
ajax в WordPress

ajax в WordPress

Использовал уже много раз ajax запросы в WordPressНо в последнее время заметил, что все-таки они долго выполняются

179
Обрезание изображения

Обрезание изображения

У меня стоит задача, сделать обрезание фото средствами выделения областиДля выделения области я использую плагин imgareaselect

176
Помогите разобраться с памятью

Помогите разобраться с памятью

Есть простая задача:

197
Не работает break point и выдает -nan(ind)

Не работает break point и выдает -nan(ind)

Решаю задачу по программированию (Работа с файлами)

223