繁体   English   中英

从两个mysql表中检索数据

[英]Retrieving data from two tables of mysql

我有两张桌子

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

   }

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

请帮我

尝试这个:

$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");

您需要在查询中进行联接。

MySQL文档:加入

看起来您需要一个可以检索所需结果集的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

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

ORDER
   BY t1.htno
    , t1.SubjectCode

问:“在结果更快之前,现在显示结果需要花费很多时间 - 你能告诉我你是否知道原因?”

答:不,我没有足够的信息来确定新声明表现缓慢的确切原因。 但我可以给你一些可能的机会。

(但我必须告诉你,我对你的查询作出回应犹豫不决,因为你已经“选择”了你的问题的答案。)

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

... Table2_IX1 ON Table2 (SubjectCode, SubjectName)

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM