首页 > 解决方案 > 写入单个名称四次连接到四个不同课程的while循环,如何修复

问题描述

我有一个 HTML 表,我在其中显示姓氏......以及一个人的课程,问题是当一个人在数据库中有多个课程(如 3 个课程)时,while 循环将写入连续

alex alexia ... ...  course 1
alex alexia ... ... course 2
alex alexia... ... course 3

如果您可以帮助我将课程和名称分组在一行中,并显示所有课程,因为如果我使用 group by 它会显示一个名称,但只有一门课程(不是全部)我尝试使用标志列来做到这一点如果一行写入但它不起作用,则在表 Personale 上设置为 1

$formazione=mysqli_query($conn,"SELECT Formazione.Data_Formazione,Personale.*,Corso.*  FROM Formazione NATURAL JOIN Personale NATURAL JOIN Corso  ORDER BY Personale.Nome ASC;");
while (($row2 = mysqli_fetch_assoc($formazione))){ 
   $flagPersonale=$row2['Flag_Personale'];
   $idPersonale=$row2['ID_Personale'];
   $aggFormazione=$row2['Aggiornamento_Formazione'];
   $nomeCorso=$row2['Nome_Corso'];
   $dataFormazione=$row2['Data_Formazione'];
   $nome=$row2["Nome"];
   $cognome=$row2["Cognome"];
   $ruolo=$row2["Ruolo"];
   $plesso=$row2["Plesso"]; 
   $flagCorso=$row2["Flag_Corso"];
   $nomEcogn=$nome+$cognome;
   if($flagPersonale==0){
   $inserimento = "UPDATE Personale SET Flag_Personale = 1
   WHERE ID_Personale = $idPersonale";
   if(mysqli_query($conn, $inserimento)) {
    echo "<tr><td class=\"$nome\" id=\"$nome\">";
    echo "<input id=\"$nomEcogn\" type=\"text\" class =\"it\" value=\"$nome\" 
    readonly=\"readonly\"></td><td><input type=\"text\" class =\"it\" 
    value=\"$cognome\" readonly=\"readonly\"></td><td><input type=\"text\" 
    class =\"it\" value=\"$ruolo\" readonly=\"readonly\"></td><td><input 
    type=\"text\" class =\"it\" value=\"$plesso\" readonly=\"readonly\"></td> 
    <td><input type=\"text\" class =\"it\" value=\"$nomeCorso\" 
    readonly=\"readonly\"> <button id=\"modifica\"><button id=\"Elimina\"></td> 
    </tr>";     
  } 
  else {
    echo" mysqli_connect_error()";
  }
}

我只想在一行中显示 alex alexia .... course 1,course2,course3,谢谢!

标签: phpmysqlsqlmysqli

解决方案


对于 MySQL,考虑使用GROUP_CONCAT可以返回项目列表的函数的聚合查询。请将您的查询调整为以下规格。请正确遵守GROUP BY(取决于设置,MySQL 可以发散)的 SQL 规则(即遵循ONLY_FULL_GROUP_BY设置)。

SELECT p.name, p.surname, 
       GROUP_CONCAT(course SEPARATOR ',') AS course_list
FROM persons p
JOIN courses c 
  ON p.person_id = c.person_id
GROUP BY p.name, p.surname

这可能涉及加入上面发布的单元级别查询。

SELECT f.Data_Formazione, p.*, agg.course_list 
FROM Formazione f
NATURAL JOIN Personale p
INNER JOIN 
   (SELECT c.person_id, GROUP_CONCAT(course SEPARATOR ',') AS course_list
    FROM courses c ON 
    GROUP BY c.person_id
   ) AS agg
  ON agg.person_id = p.person_id
ORDER BY p.Nome ASC;

然后,在 PHP 中,您可以explode将逗号分隔的课程列表放入一个数组中:

$courses_array = explode(",", $sql_data['course_list']);

推荐阅读