从两个mysql表中检索数据

时间:2012-12-21 15:17:17

标签: php mysql database forms

我有两张桌子

表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名称,我不知道如何写它

请帮帮我

3 个答案:

答案 0 :(得分: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");

答案 1 :(得分:3)

您需要在查询中加入。

MySQL documentation : Join

答案 2 :(得分: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

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

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

(但我必须告诉你,我对你的查询回答犹豫不决,因为你已经选择了#34;回答了你的问题。)

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

... 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可以使用该索引,并绕过&#34; filesort&#34;否则将需要的操作。

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

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

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