Добрый день. У меня есть много разных отношений. Я хочу знать, как я могу группировать строки с одинаковыми идентификаторами и отражать их как конкатенированные с каждой ссылкой на записи.
// from this // to this but with each link
----------Classes---------- ----------Classes----------
| Student Id | Lecture ID | | Student Id | Lecture ID |
| 1 | 1 | | 1 | 1; 2; 3 |
| 1 | 2 | | 1 | 4; 2 |
| 1 | 3 | ---------------------------
| 2 | 4 |
| 2 | 5 |
---------------------------
Вот запрос (без группы concat):
$classes = "SELECT * FROM students, lectures, classes
WHERE students.student_id=classes.student_id
AND lectures.lecture_id=classes.lecture_id"
$class_result = mysqli_query($con, $classes);
while($class = mysqli_fetch_array($class_result){
echo '<table><tr>';
echo '<td><a href="student.php?id='.$class['student_id'].'">'.$class['student'].'</a></td>';
echo '<td><a href="lecture.php?id='.$class['lecture_id'].'">'.$class['lecture'].'</a></td>';
echo '</tr></table>';
}
----------Classes----------
| Student Id | Lecture ID |
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 4 |
| 2 | 5 |
---------------------------
Вот запрос (с группой concat):
$classes = "SELECT students.student_id, student, lectures.lecture_id, GROUP_CONCAT(lecture SEPARATOR '; ')
FROM students, lectures, classes
WHERE students.student_id=classes.student_id
AND lectures.lecture_id=classes.lecture_id
GROUP BY student"
$class_result = mysqli_query($con, $classes);
while($class = mysqli_fetch_array($class_result){
echo '<table><tr>';
echo '<td><a href="student.php?id='.$class['student_id'].'">'.$class['student'].'</a></td>';
echo '<td><a href="lecture.php?id='.$class['lecture_id'].'">'.$class["GROUP_CONCAT(lecture SEPARATOR '; ')"].'</a></td>';
echo '</tr></table>';
}
----------Classes----------
| Student Id | Lecture ID | // this works but it cannot reflect each link of id of lecture
| 1 | 1; 2; 3 | // it only reflects link of one id for lecture
| 1 | 4; 2 |
---------------------------
Вот часть PHP:
<?php include ('connect.php'); ?>
<?php
$classes = "SELECT * FROM students, lectures, classes WHERE students.student_id=classes.student_id AND lectures.lecture_id=classes.lecture_id";
$class_result = mysqli_query($con, $classes);
?>
Часть HTML/PHP:
<html>
<title>Classes</title>
<body>
<table border="1" cellspacing="0" cellpadding="10" width="500">
<tr>
<td colspan="2" align="right">
<a href="add_class.php">Add Class</a>
</td>
</tr>
<tr>
<th>Student</th>
<th>Lecture</th>
</tr>
<?php while($class = mysqli_fetch_array($class_result)) { ?>
<tr>
<td align="center"><a href="student.php?student_id=<?=$class['student_id']?>"><?=$class['student']?></a></td>
<td align="center"><a href="lecture.php?lecture_id=<?=$class['lecture_id']?>"><?=$class['lecture']?></a></td>
</tr>
<?php } ?>
</table>
</body>
</html>
<?php include('close.php')?>
Это таблицы:
----------Classes---------- // wanted to ----------Classes----------
| Student | Lecture | be like | Student | Lecture |
| John | Math | this | | Math; |
| John | Literature | ---> | John | Literature;|
| Paul | Math | clickable | | Physics; |
| Paul | Speech | each | | Speech |
| Paul | Literature | lecture ---------------------------
| John | Physics | | | Math; |
| Paul | Physics | | Paul | Speech; |
| John | Speech | | | Literature;|
--------------------------- | | Physics |
---------------------------
Наконец, после всех поисковых и выборных идей. Наконец-то мне удалось сделать эту работу. Вот как идет код.
<?php
$classes = "SELECT * FROM students, lectures, classes WHERE students.student_id=classes.student_id AND lectures.lecture_id=classes.lecture_id GROUP BY students.student_id";
$class_result = mysqli_query($con, $classes);
while($class = mysqli_fetch_array($class_result)) {
$student_id = $class['student_id'];
$lectures = mysqli_query($con,"SELECT * FROM students, lectures, classes WHERE students.student_id=classes.student_id AND lectures.lecture_id=classes.lecture_id AND students.student_id='$student_id'");
$counter = 0;
?>
<tr>
<td align="center"><a href="student.php?student_id=<?=$class['student_id']?>"><?=$class['student']?></a></td>
<td align="center">
<?php while($lecture = mysqli_fetch_array($lectures)) { ?>
<a href="lecture.php?lecture_id=<?=$lecture['lecture_id']?>"><?=$lecture['lecture'];?></a>
<?php } ?>
</td>
</tr>
<?php } ?>
Теперь таблица выглядит так:
-----------------------Classes----------------------------
| Student | Lectures |
----------------------------------------------------------
| John | Math Literature Physics Speech |
----------------------------------------------------------
| Paul | Math Speech Literature Physics |
----------------------------------------------------------
Теперь я буду иметь дело с разделителями/разделителями для лекций. (например, математика, литература, физика, речь). Спасибо вам за помощь.
<?php
$conn=mysqli_connect("localhost","root","","database");
$student_query="SELECT student_id FROM classes";
$student_result=mysqli_query($conn,$student_query);
while($row_student=$student_result->fetch_assoc())
{
$student_id=$row_student['student_id'];
$lecturer_query="SELECT lecturer_id FROM classes where student_id='$$student_id'";
$lecturer_result=mysqli_query($conn,$lecturer_query);
while($row_lecturer=$lecturer_result->fetch_assoc())
{
$lecturer_id[]=$row_lecturer['lecturer_id'];
}
$result[]=array('student_id'=>$student_id,'lecturer_id'=>$lecturer_id);
}
echo json_encode($result);
Я бы, наверное, сделал что-то вроде этого:
$classes = "SELECT * FROM students, lectures, classes
WHERE students.student_id=classes.student_id
AND lectures.lecture_id=classes.lecture_id ORDER BY students.student_id";
$class_result = mysqli_query($con, $classes);
$student_ids = [];
while($class = mysqli_fetch_array($class_result)){
//fixed missing ) - while($class = mysqli_fetch_array($class_result){
if(!isset($student_ids[$class['student_id']])){
if(count($student_ids) > 1) echo '</tr></table>'; //close previous list
$student_ids[$class['student_id']] = true;
echo '<table><tr>';
echo '<td><a href="student.php?id='.$class['student_id'].'">'.$class['student'].'</a></td>';
}
echo '<td><a href="lecture.php?id='.$class['lecture_id'].'">'.$class['lecture'].'</a></td>';
}
if(count($student_ids) > 1) echo '</tr></table>'; //close last list
Обратите внимание на Order By
и массив $student_ids
. Это значит, что вы получите
так далее...
Я бы предложил использовать список описаний:
<dl>
<dt>Student A</td>
<dd>Lecture 1</dd>
<dd>Lecture 2</dd>
</dl>
Но вам придется сделать некоторые CSS на нем. Для меня это кажется лучшей структурой для этого, потому что это позволяет устранить несколько тегов и дает студенту ссылку другого тега. Но это вам.
В любом случае структура HTML и "стилизация" - это небольшая деталь, когда у вас есть данные так, как вы этого хотите. Не говоря уже о том, что нет способа узнать, как вы хотите, чтобы он выглядел, учитывая информацию, представленную в вопросе.
Тем не менее, похоже, что лекционные ссылки не зависят от ученика. Мне кажется, что это должно включать что-то от ученика или ссылки не связаны. Я имею в виду, в чем разница.
Студент А, лекция 1
А также
Студент B, лекция 1
Обе ссылки Лекции одинаковы.
<table><tr>
только при добавлении ученика, а затем закрыв его после цикла, если ученик был добавлен. Это должно быть только с одной петлей.
explode(';', $class['grouped'])
но вы должны знать, чтоgroup_concat
имеет ограничение по размеру, я бы также избавился от этого пробела в разделителе и присвоил псевдоним полю.GROUP_CONCAT(lecture SEPARATOR '; ') AS grouped
или вы можете просто упорядочить ее по полю, по которому вы группируете ...FETCH_GROUP
если бы вы использовали PDO. Для mysqli я не уверен.