【问题标题】:INNER JOIN returning un-expected NULL (PHP/MySQL)INNER JOIN 返回意外的 NULL (PHP/MySQL)
【发布时间】:2013-04-26 01:33:43
【问题描述】:

我目前正在运行一个在 while 循环中使用内部连接的函数,该函数出乎意料地没有返回任何内容。

$data3 = '\'' . implode('\', \'', $posted_email) . '\'';

$exam_recordation = mysql_query("SELECT * FROM exam WHERE partner_id IN (SELECT partner_id FROM exam WHERE Student_email = $data3) AND Student_email <> $data3");
//$name_query = mysql_query("SELECT student.email, student.name, Student_email FROM student INNER JOIN exam ON student.email = exam.Student_email WHERE student.email = $data3")

echo "<table border=='1'>
<tr>
<th>Name</th>
<th>Email</th>
<th>Exam Date</th>
<th>Level</th>
<th>Mark</th>
    <th>Style</th>

</tr>";

while($row = mysql_fetch_array($exam_recordation))
  {
  echo "<tr>";
$name_query = mysql_query("SELECT DISTINCT student.name
              FROM student
              INNER JOIN exam ON student.email = exam.Student_email
              WHERE student.email <>{$data3}");
//die();
 /*while($row1 = mysql_fetch_array($name_query))
  {
    echo "<td>" . $row1['name'] . "</td>"; //This while loop was just me overcomplicating it, soon worked out I didnt need it
  }*/
  echo "<td>" . $name_query['name'] . "</td>";
  echo "<td>" . $row['Student_email'] . "</td>";
  echo "<td>" . $row['examDate'] . "</td>";
  echo "<td>" . $row['level'] . "</td>";
  echo "<td>" . $row['mark'] . "</td>";
      echo "<td>" . $row['style'] . "</td>";

  echo "</tr>";
  }
echo "</table>";

从我自己的调试尝试中,我意识到它返回的不是我希望的值(学生表中的名称),而是当我在单独的 PHP 函数中运行它时返回 NULL 值,即不在内部如下所示的 while 循环。

$data3 = '\'' . implode('\', \'', $posted_email) . '\'';
var_dump($posted_email);
var_export($data3);
$name_query = mysql_query("SELECT DISTINCT student.name
              FROM student
              INNER JOIN exam ON student.email = exam.Student_email
              WHERE student.email <> $data3");
var_export($name_query);
echo "SELECT DISTINCT student.name
              FROM student
              INNER JOIN exam ON student.email = exam.Student_email
              WHERE student.email <> $data3";

但是,当我从 SQL 中的最后一段代码运行 echo'd INNER JOIN 时,它可以正常工作并返回 2 行名称。

SELECT DISTINCT student.name FROM student INNER JOIN exam ON student.email = exam.Student_email WHERE student.email <> 'eating@gnomes.com'

我正在研究的理论大致如下:

$name_query = mysql_query("SELECT DISTINCT student.name
              FROM student
              INNER JOIN exam ON student.email = exam.Student_email
              WHERE student.email <>{$data3}");
while($row = mysql_fetch_array($exam_recordation) && mysql_fetch_array($name_query))
  {
  echo "<tr>";
  echo "<td>" . $row['name'] . "</td>";
  echo "<td>" . $row['Student_email'] . "</td>";
  echo "<td>" . $row['examDate'] . "</td>";
  echo "<td>" . $row['level'] . "</td>";
  echo "<td>" . $row['mark'] . "</td>";
      echo "<td>" . $row['style'] . "</td>";

  echo "</tr>";
  }
echo "</table>";

这不会向我的表返回任何内容,但我想要做的是在一次提取中使用两个查询,以便将它们的结果都放入 $row 并能够提取相关数据。这实际上听起来很牵强,所以如果我认为这是我缺乏经验的过错。

我希望你能看到,我试图找出问题所在,但失败了。通常只是检查正在发送的查询是否正确已经解决了这种过去没有为我返回任何内容的问题,但对于这个问题似乎并非如此。可能是我在数组或while循环中缺少的东西,可能不是。我真的没有想法了。

【问题讨论】:

    标签: php mysql sql while-loop inner-join


    【解决方案1】:

    你确定你有这个学生的一些考试成绩吗?

    INNER JOIN 只会在两个连接表中都存在数据时返回结果。

    尝试使用 LEFT JOIN 看看是否返回。

    还可以在 phpMyAdmin 或 MySQL 控制台之类的工具中测试您的查询,以确定是否是您处理结果的错误查询。

    【讨论】:

    • 是的,我很确定。我已经在 myphpadmin 中使用 SQL 控制台来测试从 INNER JOIN 查询的回声中产生的查询,它返回了 2 行。我猜这就是你的意思。
    • phpmyadmin 不是 myphpadmin。
    【解决方案2】:

    您评论了 fetch 方法,没有它将无法工作。 这是你应该取名字的方式:

    $rowStudent = mysql_fetch_array($name_query);
    echo "<td>" . $rowStudent['name'] . "</td>";
    

    mysql_query 只发送和执行查询,要获得需要获取的结果。

    您还可以使用if($rowStudent)if(!$rowStudent) 检查是否有结果以处理没有结果。

    【讨论】:

    • 好的,首先感谢您抽出宝贵时间提供帮助。我尝试使用您的代码替换您的解决方案:echo "&lt;td&gt;" . $name_query['name'] . "&lt;/td&gt;"; 它会显示名称,但它使用第一个名称来覆盖所有结果。例如,在该函数结束时,我有两行,其中两行都具有第一条记录的名称,但应该只在两条记录中的第一条上,即结果 1 的名称为 bob,结果 2 的名称应为 bob玛丽作为正在发生的事情的一个例子。将您的代码放在我注释掉的while循环中可以解决吗?
    • 刚刚尝试将您的代码添加到我注释掉的while循环中,它所做的只是现在对两个结果都使用第二个结果的名称,因此结果1的名称现在是mary应该是 bob 并且结果 2 名称是 mary 正确地保持到上面的例子。
    • 但是你总是在寻找 student.email {$data3} ,因为 $data3 不会改变你总是会得到相同的结果。或者您可以拥有多个电子邮件或电子邮件-学生组合吗?您还应该能够在一个查询中编写所有内容,我将使用查询编辑答案。
    • 请记住,每次调用 mysql_fetch_array 时,它都会推进结果,您可能会将最后一个结果保留在 $rowStudent 中,并且该循环会跳到末尾。
    • 一个学生只会有一封连接到他们的电子邮件来清除它。编辑:是的,因此为什么在我注释掉的while循环中使用它用第二个名称替换了名称,因为第二个提取会将其选择提前一个。
    【解决方案3】:

    你应该试试这个,它只有一个连接两个表的查询。

    $data3 = '\'' . implode('\', \'', $posted_email) . '\'';
    
    $exam_recordation = mysql_query("SELECT student.name, exam.Student_email,
                exam.examDate, exam.level, exam.mark, exam.style 
                FROM student INNER JOIN exam ON student.email = exam.Student_email 
                WHERE student.email <> $data3");
    
    echo "<table border=='1'>
    <tr>
    <th>Name</th>
    <th>Email</th>
    <th>Exam Date</th>
    <th>Level</th>
    <th>Mark</th>
        <th>Style</th>
    
    </tr>";
    
    while($row = mysql_fetch_array($exam_recordation))
      {
      echo "<tr>";
    
      echo "<td>" . $row['name'] . "</td>";
      echo "<td>" . $row['Student_email'] . "</td>";
      echo "<td>" . $row['examDate'] . "</td>";
      echo "<td>" . $row['level'] . "</td>";
      echo "<td>" . $row['mark'] . "</td>";
          echo "<td>" . $row['style'] . "</td>";
    
      echo "</tr>";
      }
    echo "</table>";
    

    【讨论】:

    • 考试记录根据插入的电子邮件在考试表中找到与他们在任何考试行中具有相同 partner_id 的任何其他人。因此,ating@gnomes.com 在考试表中有两个条目,partner_id 为 1 和 2,所有其他具有这些 id 的合作伙伴都被选中。INNER JOIN 的预期用途是从他们的学生表中获取合作伙伴的考试记录找到的名称在考试表中找到的电子邮件。您的查询看起来有点混杂,因为它返回除了用于执行查询的链接电子邮件的人之外的所有人,即作为 data3。
    • 将尝试看看我是否可以按照我希望的方式进行查询,但如果您对它应该如何提出任何建议,我们将不胜感激。
    • SELECT student.name, exam.Student_email, exam.examDate, exam.level, exam.mark, exam.style, exam.partner_id FROM student INNER JOIN exam ON student.email = exam.Student_email WHERE student.email &lt;&gt; 'prof@nuts.com' AND exam.partner_id = 1 更像是我正在寻找的大数据,如果有可能使最后一个 WHERE 条件具有多个值,因为此时它为一封电子邮件返回正确的结果是只有一对的一部分。与该表中的多对分开的电子邮件怎么办?
    • 除了上面的代码看起来确实包含了所用电子邮件的考试结果,即 prof@nuts.com, 应该避免这样做。
    猜你喜欢
    • 2015-09-03
    • 2012-08-10
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    相关资源
    最近更新 更多