我使用以下声明填写Excel电子表格,其中包含学生信息,包括“actualstudenthours”。
问题是,我想向所有学生展示tblstudentstatus.id = 3,但我还需要向学生展示实际的学生时间。不幸的是,并非所有学生都在“viewactualstudenthours”中有相应的条目。这句话完全不包括“viewatualstudenthours”中没有相应条目的学生。
如何让所有学生出现在tblstudentstatus.id = 3的哪个位置?
如果在viewactualstudenthours中没有他们的条目,它不应该完全省略学生...学生时间字段应该是空白的。非常感谢您的帮助。
$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代码簿中的所有规则。)
答案 0 :(得分:1)
学习使用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表来删除select-list中的子选择。我删除了函数LEFT();如果需要,你可以重新引入它。