SQL命令逻辑出现问题-请提供帮助


Having trouble with SQL command logic - please help

我使用以下语句在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();如果需要,您可以重新引入它。