PHP 动态表正在复制我的 mysql 表中的信息

标签 php mysql sql left-join inner-join

好吧,我正在做一个学校项目,我需要从表“校友”(我来自墨西哥,所以我的表是西类牙语)中找特定职业的学生(表是计算机系统示例工程中的“carreras”)。

好吧我得到了结果(我有 2 个学生)但是每个重复了 3 次,我不知道为什么

这是我正在使用的代码:

    <?php
       include_once ("conexion.php");

    $Idcar = $_POST["Combo"];

    $sql="SELECT Car_ID_pk FROM carreras WHERE Car_nombre = '$Idcar'";

    $cs=mysql_query($sql, $cn);
    while($row=mysql_fetch_array($cs))
    {
        $idcarrera=$row["Car_ID_pk"];
    }

$query = "SELECT alumnos.Al_id_pk, alumnos.Al_nombre, alumnos.Al_ap_pat, alumnos.Al_ap_mat FROM alumnos,carreras WHERE alumnos.Carrera_ID= '$idcarrera'"; 
$cs1 = mysql_query($query,$cn);
$i = 0;

$dyn_table = '<table border="1" cellpadding="10">';
$dyn_table .= '<tr><td>Numero de control</td><td>Nombre</td><td>Apellido paterno</td><td>Apellido materno</td></tr>';
while($row = mysql_fetch_array($cs1)){ 

    $NumControl = $row["Al_id_pk"];
    $Nombre = $row["Al_nombre"];
    $Paterno = $row["Al_ap_pat"];
    $Materno = $row["Al_ap_mat"];

    if ($i % 4 == 0) 
    {
        $dyn_table .= '<tr><td>' .$NumControl. '</td><td>'.$Nombre.'</td><td>'.$Paterno.'</td><td>'.$Materno.'</td>';
    } else 
    {
        $dyn_table .= '<tr><td>' . $NumControl . '</td><td>'.$Nombre.'</td><td>'.$Paterno.'</td><td>'.$Materno.'</td></tr>';
    }
    $i++;
}
$dyn_table .= '</tr></table>';
?>
<html>
<body>
<h3>Alumnos registrados.</h3>

<?php echo 

$dyn_table; ?>

<form name="RS" method="POST" action="ABCCarrera.php">
    <input type="submit" value="Salir" />
    </form>
</body>

</html>

就像你看到我使用隐式连接一样,有一种方法可以解决这个问题,我的错误在哪里?

最佳答案

您正在使用隐式连接,但您没有过滤 WHERE 子句中的连接,因此您得到了 Cartesian product两个表中的一个:alumnos 表中的每条记录都与 carerras 表中的每个记录配对。

在您当前的查询中,您实际上并未从 carreras 表中检索任何数据,因此您只需将其从 FROM 子句中删除即可,这将使重复项消失。但是,如果您确实需要进行连接——例如,如果您想要将一些 carreras 列添加到 SELECT 列表中——那么您需要添加如下内容:

AND carreras.id = alumnos.Carrera_ID

到您的 WHERE 子句。这样可以确保每个学生都只与该学生的职业相匹配,而不是与所有职业相匹配。


为避免此类错误,您可以使用显式连接:

FROM alumnos
JOIN carreras
  ON carreras.id = alumnos.Carrera_ID
WHERE alumnos.Carrera_ID = (whatever)

显式 JOIN 中需要 ON 子句,因此如果您忘记了它,数据库会告诉您。

显式连接还将连接条件(在 ON 子句中)与过滤条件(在 WHERE 子句中)分开,这有助于使您的 SQL 更易于理解,尤其是在复杂查询中。

关于PHP 动态表正在复制我的 mysql 表中的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20436816/

相关文章:

mysql - MATCH AGAINST 对 FULLTEXT 索引不返回任何行

mysql - 查询返回错误结果,预期一行但得到全部

php - 多个 mysql 连接和正确的显示顺序

javascript - 如何将默认选择的值放入javascript并在页面加载时将其传递给php?

php 无法删除多于一行

java - 在 MySQL 语句中传递变量

SQL 服务器 : Execute nvarchar SQL statement and parametrize results without OUTPUT parameters

php mb_strtolower 给出无效字符

php - 更新 php 中的多列

mysql - 为什么这个 MySQL 索引会被用于这个查询?