2011-05-26 26 views
0

我正在使用以下语句来填充Excel电子表格中的学生信息,其中包括“actualstudenthours”。SQL命令逻辑遇到问题 - 请帮助

问题是,我想向所有学生展示tblstudentstatus.id = 3,但我还需要显示这些学生的实际学生时间。不幸的是,并不是所有的学生都在“视觉学习时间”中有相应的条目。这种说法完全排除了那些没有相应的“观看时间”的学生。

我该如何让所有学生出现在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代码书中的每个规则。)

+0

通过缩进他们四个空格注意:您可以[格式线为代码(http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks)。编辑器工具栏中的“{}”按钮可以为您做到这一点。编辑你的问题并尝试一下。单击编辑器工具栏中的橙色问号以获取更多信息和格式化提示。 – outis 2011-05-26 04:43:41

+1

@junkyjunk:不,我不是。我的建议是“junkyjunk”,你今天注册的事实,您的用户名,可能会让人觉得你是曳。为了您参考:http://msmvps.com/blogs/jon_skeet/archive/2010/08/29/writing-the-perfect-question.aspx – 2011-05-26 04:50:10

+0

我书签此网址 – Ibu 2011-05-26 04:57:47

回答

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'中添加视图名 - 它非常混乱。

请注意,我摆脱了选择列表中的子选择通过两次加入地址表,两个独立的别名。我删除了函数LEFT();如果需要,可以重新引入它。

+0

这似乎完美地工作。如果有任何问题,我会在明天再报告。我只想说谢谢。如果像你这样的人不存在,我什么都不知道。见此转化这样的具体实际的例子是这么多有用和有效的比读书对我教科书和其他人的例子。我想我明白了AS子句,我开始了解JOIN和LEFT JOIN为好。再次感谢你的帮助。 – junkyjunk 2011-05-26 05:46:30