SQL查询在PHP中循环ORDER BY

时间:2013-03-26 14:43:10

标签: php html sql sql-server-2008

编辑:添加了第一个SQL查询。

我网站的一部分有两个下拉菜单。两者中的所有选项都使用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>";
    }
    }

问题是,对于只有两个部分,这甚至是必要的(因为有两个教授名称),因为它像这样循环,它最终在下拉列表中排序#2:

1234567
2345678
3456789
4567890
1234123
2345765
3456999
4567000

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

感谢您的帮助。

3 个答案:

答案 0 :(得分: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>";
}

它比生成WHERE IN子句更优雅(并且几乎肯定更有效)。

答案 1 :(得分:1)

Yu可以这样做:

$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>";
}

只用一个IN()语法的sql查询你所有的教授。

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

答案 2 :(得分: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.

然后您将拥有关系表,这样您就可以将教授与部门和学生联系起来。

<强> faculty_2_sections

f2s_id
faculty_id
section_id

<强> student_2_sections

s2s_id
student_id
section_id

这使得它非常简单,因为如果学生已登录,那么您已经拥有了他们的学生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下拉菜单,仅向学生或教师显示特定部分。