Выбор во многих настройках отношений

0

Добрый день. У меня есть много разных отношений. Я хочу знать, как я могу группировать строки с одинаковыми идентификаторами и отражать их как конкатенированные с каждой ссылкой на записи.

// 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   |
                                              ---------------------------
  • 0
    Вы можете использовать explode(';', $class['grouped']) но вы должны знать, что group_concat имеет ограничение по размеру, я бы также избавился от этого пробела в разделителе и присвоил псевдоним полю. GROUP_CONCAT(lecture SEPARATOR '; ') AS grouped или вы можете просто упорядочить ее по полю, по которому вы группируете ...
  • 0
    Я бы использовал FETCH_GROUP если бы вы использовали PDO. Для mysqli я не уверен.
Теги:
select
many-to-many
mysqli

3 ответа

0

Наконец, после всех поисковых и выборных идей. Наконец-то мне удалось сделать эту работу. Вот как идет код.

<?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      |
----------------------------------------------------------

Теперь я буду иметь дело с разделителями/разделителями для лекций. (например, математика, литература, физика, речь). Спасибо вам за помощь.

0
<?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);
  • 0
    Я хотел бы попробовать эти @Mazhar Hussain. Если бы только это было объяснено подробно. Спасибо.
  • 0
    Вы знаете, PHP кодирование
Показать ещё 3 комментария
0

Я бы, наверное, сделал что-то вроде этого:

$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. Это значит, что вы получите

  • Студент Ссылка
    • Лекция 1 ссылка
    • Ссылка на лекцию 2
    • Ссылка на лекцию 3
  • Студенческая ссылка B
    • Лекция 1 ссылка

так далее...

Я бы предложил использовать список описаний:

<dl>
   <dt>Student A</td>
   <dd>Lecture 1</dd>
   <dd>Lecture 2</dd>
</dl>

Но вам придется сделать некоторые CSS на нем. Для меня это кажется лучшей структурой для этого, потому что это позволяет устранить несколько тегов и дает студенту ссылку другого тега. Но это вам.

В любом случае структура HTML и "стилизация" - это небольшая деталь, когда у вас есть данные так, как вы этого хотите. Не говоря уже о том, что нет способа узнать, как вы хотите, чтобы он выглядел, учитывая информацию, представленную в вопросе.

Тем не менее, похоже, что лекционные ссылки не зависят от ученика. Мне кажется, что это должно включать что-то от ученика или ссылки не связаны. Я имею в виду, в чем разница.

Студент А, лекция 1

А также

Студент B, лекция 1

Обе ссылки Лекции одинаковы.

  • 0
    Это работает @ArtisticPhoenix, но не отображается как одна строка. Под именем ряд строк появляются с соответствующими лекциями.
  • 0
    Там я исправил это, добавив <table><tr> только при добавлении ученика, а затем закрыв его после цикла, если ученик был добавлен. Это должно быть только с одной петлей.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню