我有一个脚本,旨在打印累计超过3个迟到的学生的价值观。我希望这个脚本打印出学生姓名和他们迟到的次数,但到目前为止我只能用以下脚本打印出他们的名字:
$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;
}
我想不出如何直观地做到这一点。在while循环中保留所有内容都不起作用(尽管请求了唯一的条目,但我为同一个学生提供了多个结果)所以使用array_unique是我能想到的唯一方法。
感谢您的帮助!
答案 0 :(得分: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
加入这两个表可以在一个查询中获得迟到的计数和学生的名字,以及GROUP BY和HAVING子句,它只能让你有超过3个迟到条目的学生。
答案 1 :(得分: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;
这是它的工作原理。
选择您要使用的结果:
选择StudentID,classid,日期计数(*) 来自attendance_main 其中status ='Tardy'和classid,如'%ADV%'“
将学生加入公共ID
的结果集离开学生参加student.rfid = attendance_main.StudentId
按学生分组。我们使用count(*)来获取项目数。我们知道由于select中的where子句,我们只处理迟到。
按StudentId分组
将结果限制为只有3个以上的有条件(这就像组的where子句一样)
有计数(*)> 3;