我有两张桌子
表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名称,我不知道如何写它
请帮帮我
答案 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)
您需要在查询中加入。
答案 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;时,可能会获得此查询的最佳性能。