如何发送SQL计数数据&数组数据在一起?

时间:2011-01-25 06:38:26

标签: php mysql

我有一个脚本,旨在打印累计超过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是我能想到的唯一方法。

感谢您的帮助!

2 个答案:

答案 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;

这是它的工作原理。

  1. 选择您要使用的结果:

    选择StudentID,classid,日期计数(*) 来自attendance_main 其中status ='Tardy'和classid,如'%ADV%'“

  2. 将学生加入公共ID

    的结果集

    离开学生参加student.rfid = attendance_main.StudentId

  3. 按学生分组。我们使用count(*)来获取项目数。我们知道由于select中的where子句,我们只处理迟到。

    按StudentId分组

  4. 将结果限制为只有3个以上的有条件(这就像组的where子句一样)

    有计数(*)> 3;