编辑:添加了第一个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
我在编程方面的经验使我无法理解如何解决这个看似简单的问题。
感谢您的帮助。
答案 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下拉菜单,仅向学生或教师显示特定部分。