2

テーブルが 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

学生がホールチケット番号を入力するためのフォームを提供します

生徒がフォームに 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

Q: 「以前は結果が速かったのに、結果を表示するのに時間がかかるようになりました。理由があれば教えていただけますか?」

A:いいえ、新しいステートメントのパフォーマンスが低下した正確な理由を判断するのに十分な情報がありません。しかし、私はあなたにいくつかの可能性のある可能性を与えることができます.

(ただし、質問に対する回答をすでに「選択」しているため、質問への回答をためらっていることをお伝えしなければなりません。)

パフォーマンスの低下の原因として最も可能性が高いのは、テーブルに適切なインデックスが定義されていないことです。そして、(クエリの最高のパフォーマンスのための) 最も可能性の高い候補インデックスは次のようになります。

... Table2_IX1 ON Table2 (SubjectCode, SubjectName)

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

Tableでは、htnoクエリに等値述語 (つまりWHERE htno = 'literal constant'.

また、同じインデックスの次の列を にすることは有益です。特にクエリで(または)SubjectCodeを指定する場合は、MySQL がそのインデックスを利用し、そうでなければ必要な「ファイルソート」操作をバイパスできるためです。ORDER BY t1.SubjectCodeORDER BY t1.htno, t1.SubjectCode

クエリによって参照される他のすべての列も含めるとTable1、「カバーする」インデックスが作成されます。つまり、MySQL は、基礎となるテーブルのページにアクセスする必要なく、必要なすべてのデータをインデックス ページから直接取得できます。

では、少なくともSubjectName`列Table2の先頭列を持つインデックスが必要です。その場合SubjectCode. That will allow MySQL to use that index to satisfy the join predicate. If that same index also includes the、そのインデックスはクエリの「カバー」インデックスにもなり、MySQL はアクセスする必要なく、インデックスからクエリを完全に満たすことができます。基になるテーブル内のすべてのページ。

どのインデックスが最高のパフォーマンスを発揮するかを実際に評価するにはEXPLAIN、クエリを実行してアクセス パスを確認する必要があります。ExtraEXPLAIN 出力の列に「Using index」と表示されている場合、このクエリの最高のパフォーマンスが得られる可能性があります。

于 2012-12-21T15:26:38.837 に答える