Есть две таблицы. Первая таблица студентов с личными данными. Вторая таблица с оплатами. Оплат есть несколько по каждому студенту.
Задача: Вывести всех студентов(из таблицы с личными данными) и инфо(из таблицы с оплатами) по внесенным каждым оплаты. Необходимо собрать данные из двух таблиц.
таблица с данными:
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. Помогите разобраться.
Примерный вариант:
<?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'];
}
}
?>
Вариант 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>
";
}
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Использовал уже много раз ajax запросы в WordPressНо в последнее время заметил, что все-таки они долго выполняются
У меня стоит задача, сделать обрезание фото средствами выделения областиДля выделения области я использую плагин imgareaselect