0

編集:最初のSQLクエリを追加しました。

私のウェブサイトのセクションには2つのドロップダウンメニューがあります。両方のオプションはすべて、SQLクエリを使用して入力されます。ドロップダウン#1は、クラスセクションのリストです(たとえば、A1など)。教授がセクションを選択すると、Dropdown#2に学生ID(たとえば、1234567など)が入力されます。

学生情報は表1にあります。この情報の中には「professorName」列があります。学生をクラスセクションに関連付けるには、「professorName」列を表2にある同じ列と一致させる必要があります。これは、クラスセクションが表2にのみあるためです。

ここまではすべてうまくいきます。クエリの最後にORDERBYの学生IDを入力したからです。ただし、クラスセクションの2つは、2人の異なる教授に関連付けられています。この問題に対処するために、次のコードを使用して各教授の名前をループしました。

 $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つのセクション(professorNamesが2つあるため)については、このようにループしているため、ドロップダウン#2で次のように順序付けられてしまうことです。

1234567
2345678
3456789
4567890
1234123
2345765
3456999
4567000

プログラミングの経験が限られているため、この一見単純な問題を修正する方法を理解できません。

ご協力ありがとうございました。

4

3 に答える 3

2

教授をループしてそれぞれのtable1にクエリを実行するのではなく、2番目のクエリでtable1とtable2を結合し、データベースに1回だけクエリを実行します。例えば:

$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句を生成するよりもエレガントです(そしてほぼ確実に効率的です)。

于 2013-03-26T14:51:44.077 に答える
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()これは、構文を使用して1つのSQLですべての教授をクエリすることです。

更新: mysqlの代わりにSQLサーバーを使用していることに気付いたので、IN()構文を少し変更し、SQLサーバーのヘルプドキュメントへのリンクを変更しました。

于 2013-03-26T14:52:13.030 に答える
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プルダウンにデータを入力し、特定のセクションの学生または教職員のみを表示できます。

于 2013-03-26T15:07:11.683 に答える