我使用以下语句在Excel电子表格中填写学生信息,包括"actualstudentours"
问题是,我想显示tblstudentstatus.id=3的所有学生,但我也需要显示这些学生的实际学习时间。不幸的是,并不是所有的学生都在"viewactualstudenthurs"中有相应的条目。这种说法完全排除了那些在"viewatualstudenthurs"中没有相应条目的学生
如何让所有学生出现在tblstudentstatus.id=3的位置?
如果在视图实际学生中没有他们的条目,就不应该完全忽略学生。。。学生时间字段应该是空白的。非常感谢您的帮助。
$result=mysqli_query($dbc,"SELECT tblstudent.first, tblstudent.last,
LEFT(viewactualstudenthours.ACTUAL_remain,5),
(SELECT first from tbladdress where tbladdress.id = tblstudent.contact2),
(SELECT last from tbladdress where tbladdress.id = tblstudent.contact2),
tbladdress.address1,tbladdress.city,tbladdress.state,tbladdress.zip1,
tbladdress.phone, tbladdress.cell, tbladdress.email
FROM tblstudent, tbladdress, tblstudentstatus, viewactualstudenthours
WHERE viewactualstudenthours.student_id = tblstudent.id
AND tblstudent.status = tblstudentstatus.id
AND tbladdress.id = tblstudent.contact1
AND tblstudentstatus.id = 3");
(注意:编辑器使SQL变得半可读,但可能破坏了PHP代码手册中的所有规则。)
学习使用SQL-92中引入的显式联接表示法,而不是FROM子句中旧的以逗号分隔的表名列表。
您需要将表tblstudent
的LEFT OUTER JOIN与视图viewactualstudenthours
一起使用。忽略使代码在PHP中工作所需的引号等,您需要:
SELECT S.first, S.last,
H.ACTUAL_remain,
A2.first, A2.last,
A1.address1, A1.city, A1.state, A1.zip1,
A1.phone, A1.cell, A1.email
FROM tblstudent AS S
JOIN tbladdress AS A1 ON S.Contact1 = A1.ID
JOIN tbladdress AS A2 ON S.Contact2 = A2.ID
JOIN tblstudentstatus AS T ON S.Status = T.ID
LEFT JOIN viewactualstudenthours AS H ON S.ID = H.Student_ID
WHERE T.id = 3
还要学习使用表别名(AS子句)——它简化并阐明了SQL。如果架构由您决定,请不要在表名前面加"tbl",在视图名前面加上"view"——这太混乱了。
请注意,我使用两个独立的别名两次加入Address表,从而消除了选择列表中的子选择。我删除了函数LEFT();如果需要,您可以重新引入它。