2013-03-26 146 views
0

编辑:添加了第一个SQL查询。SQL查询ORDER BY在PHP中循环

我网站的一部分有两个下拉菜单。两者中的所有选项都使用SQL查询进行填充。下拉#1是一个类部分的列表(例如A1)。一旦教授选择了一个部分,Dropdown#2就会填入学生ID(例如1234567)。

学生信息位于表1中。其中包含'professorName'列。为了将学生与班级相关联,我需要将'professorName'列与表2中找到的相同列相匹配,因为班级部分仅在表2中找到。

直到此处,一切都很好,因为在我的查询结束时,我把ORDER BY学生ID。然而,两个课堂部分与两位不同的教授联系在一起。为了解决这个问题,我使用了下面的代码来遍历每个教授的名字。

$from site = $_POST['section']; 

    $query = ("SELECT professorName FROM Table 2 WHERE classSection='$fromsite'"); 
    $NumberofProfessorNames = $objMSSQL->getAffectedRows(); 

    echo $NumberofProfessorNames; 

    for ($j=0; $j<$NumberofProfessorNames; $j++) 
    { 
    $section= $query[$j][professorName]; 

    $output = $objMSSQL->getTable("SELECT DISTINCT StudentID from table1 WHERE professorName='$section' ORDER BY StudentID"); 

    for ($i=0; $i<$objMSSQL->getAffectedRows(); $i++) 
    { 
    echo "<option value='".$output[$i][studentID]."'>".$output[$i][studentID]."</option>"; 
    } 
    } 

的问题是,对于只有两个部分,其中这甚至是必要的(因为有两个professorNames),因为它是循环这个样子,这是结束了在下拉#2下令这样的:

1234567 
2345678 
3456789 
4567890 
1234123 
2345765 
3456999 
4567000 

我在编程方面的有限经验使我无法理解如何解决这个看似简单的问题。

谢谢你的帮助。

+0

是StudentID字段是数据库中的INT字段吗? – 2013-03-26 14:46:53

+0

也许不是,如果它是一个普通的学生ID。在我工作和去过的大多数大学中,他们倾向于包含连字符。 – 2013-03-26 14:47:59

+0

@exampleusername我不熟悉术语INT字段,对不起。 – BillyCode 2013-03-26 14:51:49

回答

2

而不是遍历教授和每个查询table1,在第二个查询中连接table1和table2,并只查询一次数据库。例如:

$query = [... FROM Table2...]; 
$NumberofProfessorNames = $objMSSQL->getAffectedRows(); 

echo $NumberofProfessorNames; 

$output = $objMSSQL->getTable(" 
    SELECT DISTINCT StudentID 
    from table1 
     join table2 
      on ... 
    WHERE [the same clause you used in $query] 
    ORDER BY StudentID" 
); 

for ($i=0; $i<$objMSSQL->getAffectedRows(); $i++) 
{ 
    echo "<option value='".$output[$i][studentID]."'>".$output[$i][studentID]."</option>"; 
} 

它比产生条款A WHERE更优雅(而且几乎可以肯定更有效)。

+0

我会看看这个,看看它是否可能在我的上下文中,谢谢。 – BillyCode 2013-03-26 14:53:11

1

郁可这样来做:

$section = "('"; 
for ($j=0; $j<$NumberofProfessorNames; $j++) 
{ 
    $section.= $query[$j][professorName] . "','"; 
} 
$section = substr($section, 0, -3) . ')'; //$section contains ('prof1','prof2') 

$output = $objMSSQL->getTable("SELECT DISTINCT StudentID from table1 WHERE professorName IN $section ORDER BY StudentID"); 

for ($i=0; $i<$objMSSQL->getAffectedRows(); $i++) 
{ 
    echo "<option value='".$output[$i][studentID]."'>".$output[$i][studentID]."</option>"; 
} 

是在短短一个SQL与IN()语法查询所有的教授。

更新:我刚刚注意到你使用sql server而不是mysql,所以我改变了IN()语法并改变了链接到sql server帮助文档。

0

这听起来像你的表没有正常化。良好的表格可以有章节表,学生表和教授表。每个表格中的信息应该特定于表格的主题。

学生

student_id 
student_last_name 
student_first_name 
student_address 
etc 

部分

section_id 
section_name - multiple sections can tend to have the same name but differing content 
section_description 
section_year - sections can change from year to year 

教师

faculty_id 
faculty_name - this is not a key field, more than one person can have the same name. 
faculty_address 
faculty_type - adjunct, fulltime, etc. 

你将不得不RELAT所以您可以将教授与部分和学生与部分相关联。

faculty_2_sections

f2s_id 
faculty_id 
section_id 

student_2_sections

s2s_id 
student_id 
section_id 

这使得超级简单,因为如果学生登录,那么你已经有了自己的学生证。如果它是一个教授,您已经有了自己的faculty_id

如果你拉的学生,您的SQL可能是这样的:

$sql = "select * from students s,sections sc,faculty f,faculty_2_sections f2s,student_2_sections s2s where student_id='$student_id' and s2s.student_id=s.student_id and s2s.section_id=sc.section_id and f2s.faculty_id=f.faculty_id and f2s.section_id=s2s.section_id"; 

如果你拉的教员,你这样做:

$sql = "select * from students s,sections sc,faculty f,faculty_2_sections f2s,student_2_sections s2s where faculty_id='$faculty_id' and f2s.faculty_id=f.faculty_id and f2s.section_id=s2s.section_id and s2s.section_id=sc.section_id and s2s.student_id=s.student_id"; 

然后,您可以拉出部分列表来填充section_ids下拉菜单,以仅向学生或教师显示特定部分。

+0

是的,数据库的确有些混乱。不幸的是,我无法改变这种情况。我很喜欢你的回复,非常翔实。 – BillyCode 2013-03-26 15:19:05

+0

噢,好的。对于那个很抱歉。 – 2013-03-26 15:21:54

+0

不需要抱歉!有趣的配置文件描述顺便说一句,惊人的是你年轻的开始 – BillyCode 2013-03-26 15:36:43