2011-01-25 12 views
0

私は、3つ以上の遅れが発生した生徒の値を印刷するように設計されたスクリプトを用意しています。私は、このスクリプトは、生徒の名前、そして、彼らは遅刻してきた倍の量の両方をプリントアウトしたいのですが、これまでのところ、私は次のスクリプトで自分の名前をプリントアウトするだけことができました:SQLカウントデータと配列データを一緒に送る方法は?

$sql = "select DISTINCT StudentID,classid,date from attendance_main where status = 'Tardy' AND classid like '%ADV%'"; 
$result = mysql_query($sql) or die (mysql_error()); 
while($row=mysql_fetch_array($result)) { 
     $studentid = $row['StudentID']; 
     $sql2 = "select distinct StudentID,classid,date from attendance_main where StudentID = '$studentid' AND status = 'Tardy' AND classid like '%ADV%'"; 
     $result2 = mysql_query($sql2) or die (mysql_error()); 
     while($row2=mysql_fetch_array($result2)) { 
       $tardycount = mysql_num_rows($result2); 
       $studentid = $row2['StudentID']; 
       if($tardycount >= 3) { 

           $sql3 = "select * from students where rfid = '$studentid'"; 
           $result3 = mysql_query($sql3) or die (mysql_error()); 
           while($row3=mysql_fetch_array($result3)) { 
             $fname[] = $row3['fname']; 
           } 
         } 
       } 
     } 


$newdata = array_unique($fname); 
foreach ($newdata as $value) { 
     echo $value; 
} 

I直感的にこれを行う方法を考えることができません。 whileループですべてを維持することはできませんでした(ユニークなエントリを要求しても同じ学生に複数の結果が出ていました)ので、array_uniqueを使用することが考えられる唯一の方法でした。

ありがとうございました!このような

+0

テーブルレイアウトを追加してください。最初の一見では、あなたが本当にちょうど学生名と彼らが遅れている時間の量をプリントアウトしたい場合、あなたのPHPスクリプトソリューションは、あまりにも複雑なように見えます。これが理由であれば、1つのSQL文で簡単に実行可能でなければならず、必要に応じてPHPで処理できます。 – Bjoern

答えて

1

ほとんどすべてをSQLで実行できます。このように見えるはずです。

select StudentID, classid, date count(*) 
from attendance_main 
where status = 'Tardy' AND classid like '%ADV%'" 
left join student on student.rfid = attendance_main.StudentId 
group by StudentId 
having count(*) > 3; 

これはどのように動作するのですか。

  1. あなたと仕事をしたい結果を選択します。

    選択StudentID、CLASSID、ステータス= '遅刻' AND 'の%のADVの%'」

    のようなのclassid日付・カウント(*) attendance_mainから
  2. がstudent.rfid = attendance_main.StudentId

  3. に学生を参加左の共通IDに設定され、あなたの結果を学生に参加学生によるすべてのグループ
  4. グループcount(*)を使用して項目数を取得します。私たちは、選択肢のwhere句のために、私たちは遅れにしか対応していないことを知っています。 StudentId

  5. 限界によって

    基を有するclauesと3上のみtardiesに結果

    有するCOUNT(*)> 3(これは、グループに対してwhere句のようなものです)。

4

何か:

SELECT 
    attendance_main.StudentID, 
    students.fname, 
    COUNT(attendance_main.*) AS `times_tardy` 
FROM 
    attendance_main 
INNER JOIN 
    students 
ON 
    attendance_main.StudentID = students.rfid 
WHERE 
    attendance_main.status = 'Tardy' 
AND 
    attendance_main.classid like '%ADV%' 
GROUP BY 
    attendance_main.StudentID 
HAVING 
    `times_tardy` > 3 

2つのテーブルを結合することは、あなたに3つの以上の遅刻のエントリであなただけの学生を取得遅刻回数や1つのクエリ内の学生の名前、およびGROUP BYとHAVING句を取得します。

+0

ありがとうございます。私はまだ比較的新しいSQLクエリですが、次の問題が発生しました。 SQL構文にエラーがあります。あなたのMySQLサーバーのバージョンに対応するマニュアルをチェックして、正しい構文が使えるようにしてください '*)AS 'times_tardy'出席者から出席するt1 INNER JOIN students t2 ON t' 4行目 私は愚かであるか、どこかにタイプミスがありますか?その中で? –

+0

ここではCOUNT(*)を試してみます。クエリをテストするためのテーブルを作成していないので、間違いを犯している可能性があります。 –

+0

Danさんありがとうございました。私はある日、それが私のために簡単なことを願っています!ハハ。 –

関連する問題