1

私は学生のデータベースを持っています。

    CREATE TABLE classlist
        (`id` int, `studentid` int, `subjectid` int, `presentid` int)
    ;

    CREATE TABLE student
        (`id` int, `name` varchar(4))
    ;

    CREATE TABLE subject
        (`id` int, `name` varchar(4))
    ;

    CREATE TABLE classStatus
        (`id` int, `name` varchar(8))
    ;

    INSERT INTO classlist
        (`id`, `studentid`, `subjectid`, `presentid`)
    VALUES
        (1, 111, 1, 1),
        (2, 222, 3, 0),
        (3, 333, 2, 1),
        (4, 111, 4, 1),
        (5, 111, 1, 0),
        (6, 222, 3, 0),
        (7, 333, 2, 1),
        (8, 111, 4, 1),
        (9, 111, 2, 0),
        (10, 111, 4, 1),
        (11, 111, 1, 1),
        (12, 333, 3, 1),
        (13, 333, 2, 1),
        (14, 333, 3, 1)
    ;

    INSERT INTO student
        (`id`, `name`)
    VALUES
    (111, 'John'),
    (222, 'Kate'),
    (333, 'Matt')
    ;

    INSERT INTO subject
        (`id`, `name`)
    VALUES
    (1, 'MATH'),
    (2, 'ENG'),
    (3, 'SCI'),
    (4, 'GEO')
    ;

    INSERT INTO classStatus
        (`id`, `name`)
    VALUES
    (0, 'Absent'),
    (1, 'Present')
    ;

そして、彼らが何回出席または欠席したかを示すクエリがあります。

    SELECT
       studentid,
       students.name AS NAME,
       SUM(presentid = 1) AS present,
       SUM(presentid = 0) AS absent

    FROM classlist
    INNER JOIN student as students ON classlist.studentid=students.id

     GROUP BY studentid, NAME

以下のこのフィドルを参照してください。 http://sqlfiddle.com/#!2/fe0b0/1

このサンプル データを見ると、サブジェクト ID 4 に出席すると、次のクラスに出席しないことが多いという傾向があるようです。これをクエリでキャプチャするにはどうすればよいですか。last subjectid = 4 のデータのみを表示したい。したがって、私の基準に一致するサンプルデータ行は次のようになります。

    (5, 111, 1, 0),
    (9, 111, 2, 0),
    (11, 111, 1, 1),

これらの行はすべて、subjectid=4 を持つ学生 ID の次の行であるためです。

私の出力は

    | STUDENTID | NAME | PRESENT    | ABSENT|
    | 111       | John | 1          | 2     |
4

2 に答える 2

1

生徒の次のクラスを取得するには、相関サブクエリを使用します。

select cl.*,
       (select min(cl2.id) from classlist cl2 where cl2.studentid = cl.studentid and cl2.id > cl.id) as nextcl
from classlist cl

これをクエリの例に差し込むと、次のクラスの出席者と欠席者がわかります。

SELECT students.id, students.name AS NAME,
       SUM(cl.presentid = 1) AS present, SUM(cl.presentid = 0) AS absent,
       sum(clnext.presentid = 1) as presentnext
FROM (select cl.*,
             (select min(cl2.id) from classlist cl2 where cl2.studentid = cl.studentid and cl2.id > cl.id) as nextcl
      from classlist cl
     ) cl INNER JOIN
     student as students
     ON cl.studentid = students.id left outer join
     classlist clnext
     on cl.nextcl = clnext.id
 GROUP BY students.id, students.NAME

a を追加しwhere cl.subjectid = 4て、件名 4 の回答を取得します。

クエリを修正しました。SQLFiddle はkです。

于 2013-01-08T14:45:53.090 に答える
0

迅速で汚い解決策は、subjectid = 4(nと呼びましょう)のすべての行のClasslist.Idを取得してから、Id = n+1のすべての行を選択することです。

于 2013-01-08T10:37:36.763 に答える