0

我有一个学校学生列表的 SELECT 语句,它目前使用以下代码运行,但是我发现每次计数需要 1-2 秒,这个数据库上的大多数其他简单查询不到半秒所以我认为我在这里做得非常低效。有一个更好的方法吗?1-2 秒可能听起来不多,但在更详细的声明中,我在下面添加了还计算存在/不存在的主题等,因此当我将所有内容包含在声明中时,运行时间接近 30 秒。

        SELECT studentID AS sID, stu.name AS Name,
        (
        SELECT COUNT( * )
        FROM attendance
        WHERE ((sID = 1)
        AND classdate < CURDATE( ))
        ) AS present, 
        (
        SELECT COUNT( * )
        FROM attendance
        WHERE ((sID != 1)
        AND classdate < CURDATE( ))
        ) AS absent
        FROM attendance
        INNER JOIN students AS stu ON attendance.studentID = stu.id
        WHERE awayid != -1
        GROUP BY sID
        ORDER BY present ASC

        ---------------------------------------------
        |   sID |   Name    |   present |   absent  |
        |   1   |   John    |   28      |   2       |
        |   2   |   Richard |   26      |   4       |
        |   3   |   Harry   |   22      |   8       |
        |   4   |   Sarah   |   22      |   8       |
        |   5   |   Tanya   |   20      |   10      |
        |   6   |   Nathan  |   20      |   10      |
        |   7   |   Kate    |   20      |   10      |
        ---------------------------------------------
4

2 回答 2

1

您可以使用条件聚合:

select studentID as sID, stu.name,
       sum((sID = 1) AND classdate < CURDATE( )) as present,
       sum((sID != 1) AND classdate < CURDATE( )) as absent
FROM attendance INNER JOIN
     students AS stu
     ON attendance.studentID = stu.id
WHERE awayid != -1
GROUP BY sID
ORDER BY present ASC;

但是,让我感到困惑的是sID在子查询中的使用。它不会引用studentId外部的select。我怀疑应该在那里使用另一个变量。(而且,如果有sidin attendance,你为什么要studentID sID在外部查询中调用?)

于 2013-08-15T10:35:20.503 回答
1

做一些假设,试试这个:

SELECT
    studentID AS sID,
    stu.name AS Name,
    sum(a.sID = 1) as present,
    sum(a.sID != 1) as absent
FROM students AS stu
JOIN attendance a ON a.studentID = stu.id
    AND classdate < CURDATE( )
WHERE awayid != -1
GROUP BY 1, 2
ORDER BY present ASC

请注意,在 mysql 中 true is1和 false is 0,因此SUM(condition)计算它为 true 的次数,从而避免了CASE其他数据库所需的繁琐使用。

于 2013-08-15T10:34:53.793 回答