在不同的表MySQL中获取相应的列

时间:2016-05-21 07:32:58

标签: php mysql

有没有办法可以使用sub_name而不是sub_id?

这是我的代码..

echo "<table border=1 align=center><tr class=style2><td>Date<td>Student Name <td> Subject <td> Score";

$sortQuery = mysql_query("select * from mst_adminresult",$cn) or die(mysql_error());

while($row=mysql_fetch_row($sortQuery))
{
    echo "<tr class=style8><td>$row[5]<td>$row[1] <td align=center> $row[4] <td align=center> $row[3]/20";   
}
echo "</table>";

此代码显示所有考试的结果。在Subject中,它的输出是主题ID。我只是想知道是否有任何办法可以得到它的主题名称。主题名称在不同的表格中。

adminresult_tbl

CREATE TABLE `mst_adminresult` (
  `adminResultID` int(5) NOT NULL,
  `login` varchar(20) NOT NULL,
  `test_id` varchar(20) NOT NULL,
  `score` int(3) NOT NULL,
  `test_date` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

subjecet_tbl

CREATE TABLE `mst_subject` (
  `sub_id` int(5) NOT NULL,
  `sub_name` varchar(25) DEFAULT NULL,
  `sub_desc` text
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

test_tbl

CREATE TABLE `mst_test` (
  `test_id` int(5) NOT NULL,
  `sub_id` int(5) DEFAULT NULL,
  `test_name` varchar(30) DEFAULT NULL,
  `total_que` varchar(15) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

程序的流程是,当用户参加考试时,用户将被重定向到列出所有科目的页面,然后用户将选择她想要的科目,之后,列表测试将显示,然后用户将再次选择,那时用户可以进行测验。

在主题列表中,我调用了subject_tbl。在测试列表中,test_tbl。当用户完成考试后,它将存储在adminresult_tbl

2 个答案:

答案 0 :(得分:0)

加入3个表格。试试这个:

SELECT * FROM mst_adminresult m
JOIN test_tbl t ON t.test_id = m.test_id
JOIN subject_tbl s ON s.sub_id = t.sub_id;

答案 1 :(得分:0)

正如@PrinceG所描述的,您可以使用JOIN syntax来读取其他表中的值。为了保持编码的格式,SQL语句应该是这样的:

SELECT ar.*, s.sub_name 
   FROM mst_adminresult AS ar
      LEFT JOIN mst_test AS t ON t.test_id = ar.test_id
      LEFT JOIN mst_subject AS s ON s.sub_id = t.sub_id;

这样做可以让您通过$row[6]访问主题的名称。

但是,请注意,您的数据库建模风险很大:

  • 您未在主数据(例如mst_subjectmst_test)表格中指定任何primary key。如果不仔细处理,这可能会导致严重的数据不一致。出于好的理由,引入主键是一个非常好的习惯 - 例如,请参阅http://www.mysqltutorial.org/mysql-primary-key/
  • 虽然基础数据库引擎InnoDB支持,但没有为您的表设置referential integrity。因此,可能会发生 - 例如 - test_idmst_adminresultmst_test,而LEFT JOIN中没有相应的记录。由于上面的语句使用NULL s,这不会抑制返回的结果集中的记录,但PHP中会显示mst_adminresult值。但是,我怀疑这是故意的。相反,我认为这是一种更好的方法,在将mst_test中的记录插入到目前为止mst_subject中没有提供测试时,DB会引发错误。 对于mst_test
  • ,同样的模式也适用于onSubmit(value: any): void { form.controls.forEach((name, control) => { control.updateValue(''); control.setErrors(null); }); }

总而言之,您可能会在ER Modeling感兴趣的文章中找到类似的文章。