【问题标题】:Retrieving data from two tables of mysql从mysql的两个表中检索数据
【发布时间】:2012-12-09 04:17:58
【问题描述】:

我有两张桌子

表1

 HTNO          SUBJECTCODE          INTERNALS          EXTERNALS            TOTAL
   1               s1                   20                  58                 78
   1               s2                   15                  20                 35
   1               s3                   10                  60                 70 
   2               s1                   10                  20                 30
   2               s2                   12                  30                 42
   2               s3                   15                  55                 70
   .
   .
   .
   so on up to N

表 2

  SUBJECTCODE             SUBJECT NAME
       s1                    MATHS
       s2                   SCIENCE
       s3                    SOCIAL

我会给学生一张表格让学生输入门票号码

如果学生在表格中输入 1,那么结果应该是

   Subjectcode        SubjectName        Internals       Externals        Total
       s1                Maths              20              58              78
       s2               Science             15              20              35
       s3                Social             10              60              70

上面应该是输出

但是在这里我无法从结果中的 Table2 中检索 SubjectName

这是我正在使用的代码

    <?PHP
    $userInputEntities = htmlentities($userInput);
    echo $userInputEntities;

    $username = "admin";
    $password = "123456";
    $database = "test";
    $server = "localhost";
    $db = new PDO ("mysql:host=$server;dbname=$database", "$username", "$password");

    if ($db) {
    $id = $_GET['id'];
    $SQL = $db->prepare("SELECT * FROM Table1 WHERE htno = :id");
    $SQL -> execute(array(':id'=>$id));
    $n = $SQL->rowCount();
    echo "
    <center><table class='dynamic styled with-prev-next' data-table-tools='{'display':true}' align=center>
    <thead>
    <tr>
    <TH class='table-header dark' scope='col'>SUBJECT CODE</TH>
    <TH class='table-header dark' scope='col'>SUBJECT NAME</TH>
    <TH class='table-header dark' scope='col'>INTERNALS</TH>
    <TH class='table-header dark' scope='col'>EXTERNALS</TH>
    <TH class='table-header dark' scope='col'>TOTAL</TH>

    </tr></thead><center>";          

    while ($db_field = $SQL->fetch(PDO::FETCH_ASSOC)) {


    echo "<tr><tbody>";
    echo "<td align=center>" . $db_field['SubjectCode'] . "</td>";

     echo "<td align=center>" . $db_field['Internals'] . "</td>";
   echo "<td align=center>" . $db_field['Externals'] . "</td>";
   echo "<td align=center>" . $db_field['Total'] . "</td>";

   echo "</tbody></tr>";

   }

使用此代码,我无法获取学生特定主题代码的主题名称 实际上我没有写任何代码来从 Table2 中检索配音名称,我不知道如何写它

请帮帮我

【问题讨论】:

    标签: php mysql database forms


    【解决方案1】:

    试试这个:

    $SQL = $db->prepare(
     "SELECT T2.Subjectcode, T2.SubjectName, T1.Internals, T1.Externals, T1.Total FROM Table1 as T1
          JOIN Table2 as T2
             ON T1.SUBJECTCODE = T2.SUBJECTCODE
       WHERE T1.HTNO = :id");
    

    【讨论】:

    • 解析错误:语法错误,第 13 行 /home/nhtsoft/public_html/engineershub/jntutest/b-tech1/resdb.php 中的意外 T_STRING 这是我遇到的错误,第 13 行是 $ SQL = $db->prepare(SELECT T2.Subjectcode, T2.SubjectName, T1.Internals, T1.Externals, T1.Total FROM Table1 as T1
    • 是的,谢谢你,但在结果更快之前,但现在显示结果需要很多时间 - 如果你知道原因,你能告诉我吗? @hamlet hakobyan
    • 您必须在两个表的SUBJECTCODE 列中添加索引。
    【解决方案2】:

    您需要在查询中加入。

    MySQL documentation : Join

    【讨论】:

      【解决方案3】:

      看起来您需要一条 SQL 语句来检索您想要的结果集:

      SELECT t1.SubjectCode
           , t2.SubjectName
           , t1.Internals
           , t1.Externals
           , t1.Total
        FROM Table1 t1
        JOIN Table2 t2
          ON t2.SubjectCode = t1.SubjectCode
       WHERE t1.htno = :id
      

      要以可预测的顺序返回行,您可以在查询文本中包含 ORDER BY 子句,跟在 WHERE 子句之后:

      ORDER
         BY t1.htno
          , t1.SubjectCode
      

      问:“之前结果更快,但现在显示结果需要很长时间 - 如果你知道原因,你能告诉我吗?”

      答: 不,我没有足够的信息来确定新语句执行缓慢的确切原因。但我可以给你一些可能的可能性。

      (不过我必须告诉你,我很犹豫要不要回答你的问题,因为你已经“选择”了你的问题的答案。)

      性能缓慢的最可能解释是您没有在表上定义适当的索引。最可能的候选索引(为了您的查询的最佳性能)将是:

      ... Table2_IX1 ON Table2 (SubjectCode, SubjectName)
      

      ... Table1_IX1 ON Table1 (htno, SubjectCode, Internals, Externals, Total)
      

      Table 上,您至少需要一个具有htno 前导列的索引,因为您的查询包含一个相等谓词(即WHERE htno = 'literal constant'

      将同一索引中的下一列设置为SubjectCode 将是有益的,特别是如果您在查询中指定ORDER BY t1.SubjectCode(或ORDER BY t1.htno, t1.SubjectCode),因为MySQL 可以利用该索引并绕过否则需要的“文件排序”操作。

      如果您还包括查询引用的Table1 中的所有其他列,那么您将拥有一个“覆盖”索引。这意味着MySQL可以直接从索引页面获取所有需要的数据,而无需访问底层表的页面。

      Table2 上,您至少需要一个前导列为SubjectCode. That will allow MySQL to use that index to satisfy the join predicate. If that same index also includes theSubjectName` 列的索引,那么该索引也将是您查询的“覆盖”索引,MySQL 可以完全满足查询从索引中获取,无需访问基础表中的任何页面。

      要真正评估哪些索引会提供最佳性能,您需要EXPLAIN 您的查询,并查看访问路径。当 EXPLAIN 输出中的 Extra 列显示“使用索引”时,可能会获得此查询的最佳性能。

      【讨论】:

      • 解析错误:语法错误,第 13 行 /home/nhtsoft/public_html/engineershub/jntutest/b-tech1/resdb.php 中的意外 T_STRING 我收到此错误@spencer7593
      • v 谢谢你,但在结果更快之前,但现在显示结果需要很长时间 - 如果你知道原因,你能告诉我吗? @spencer7593
      • 非常感谢@spencer7593,添加索引后,我的结果是 vvvfast :)thanksalot 先生
      猜你喜欢
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多