遇到SQL命令逻辑问题 - 请帮忙

时间:2011-05-26 04:40:38

标签: php mysql

我使用以下声明填写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代码簿中的所有规则。)

1 个答案:

答案 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();如果需要,你可以重新引入它。