2

我有两张桌子

表格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

我会给学生一张表格,让他们输入 Hallticket 号码

如果学生在表格中输入 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 中检索主题名称,我不知道如何编写它

请帮我

4

3 回答 3

4

试试这个:

$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");
于 2012-12-21T15:22:37.793 回答
3

您需要在查询中加入。

MySQL 文档:加入

于 2012-12-21T15:22:34.447 回答
2

看起来您需要一个 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查询并查看访问路径。Extra当EXPLAIN 输出中的列显示“使用索引”时,可能会获得此查询的最佳性能。

于 2012-12-21T15:26:38.837 回答