2012-07-04 2 views
8

私は説明するのは比較的簡単ですが(私のやや限られたスキルを踏まえて)、SQLクエリを書くのは難しいです。 1は、私が選んだの例のようなものから、想像のとおりexam_nodateは必ずしも関連していないことを連続した値を含むトリッキーなSQLクエリ

exam_no | name | surname | result | date 
---------+------+---------+--------+------------ 
1  | John | Doe  | PASS | 2012-01-01 
1  | Ryan | Smith | FAIL | 2012-01-02 <-- 
1  | Ann | Evans | PASS | 2012-01-03 
1  | Mary | Lee  | FAIL | 2012-01-04 
...  | ... | ...  | ... | ... 
2  | John | Doe  | FAIL | 2012-02-01 <-- 
2  | Ryan | Smith | FAIL | 2012-02-02 
2  | Ann | Evans | FAIL | 2012-02-03 
2  | Mary | Lee  | PASS | 2012-02-04 
...  | ... | ...  | ... | ... 
3  | John | Doe  | FAIL | 2012-03-01 
3  | Ryan | Smith | FAIL | 2012-03-02 
3  | Ann | Evans | PASS | 2012-03-03 
3  | Mary | Lee  | FAIL | 2012-03-04 <-- 

注:

は、私たちはこの1つのような表があるとします。最新の試験( exam_no = 3)( John DoeRyan SmithMary Lee)失敗したすべての学生を見つけることから

  • :次のように

    さて、私が行う必要があるクエリがあります。

  • これらの生徒のそれぞれについて、連続して失敗した試験のバッチの最初の日付が見つかります。それを置くもう1つの方法は、これらの生徒のそれぞれが、最後の合格試験の後に最初に失敗した試験の日付を見つけることです。 (テーブルの矢印を見てください)。

結果の表には、このようなものでなければなりません:どのように私は、このようなクエリを実行することができます

name | surname | date_since_failing 
------+---------+-------------------- 
John | Doe  | 2012-02-01 
Ryan | Smith | 2012-01-02 
Mary | Lee  | 2012-03-04 

ありがとうございます。

+0

他の読者:彼が「MySQL」というタグをつけていることをご了承ください –

+0

result = 'FAIL'で同じテーブルに参加し、日付の高いものから選択することができます。何を試しましたか? – Jocke

+0

「*最新の試験*」はどういう意味ですか?最新の日付の試験ですか? – eggyal

答えて

4

を生成しますので、問題最新のパスので、失敗した最初の試験を見つけることに帰着する:

SELECT name, surname, MIN(date) date_since_fail 
FROM  results NATURAL LEFT JOIN (
    SELECT name, surname, MAX(date) lastpass 
    FROM  results 
    WHERE result = 'PASS' 
    GROUP BY name, surname 
) t 
WHERE result = 'FAIL' AND date > IFNULL(lastpass,0) 
GROUP BY name, surname 

sqlfiddleでそれを参照してください。

+0

これはまさにそれです。私はそれがどれほど簡潔で理解しやすいのか信じられません。私は最小の努力でそれを私の本当の問題に適応させました。どうもありがとうございます。 – Gabriel

0

私は次のように最後の試験に合格したフェッチサブクエリ、 気にいらを使用する必要があります。これは十分にある

SET @query_exam_no = 3; 
SELECT 
name, 
surname, 
MIN(IF(date > last_passed_exam, date, NULL)) AS date_failing_since 
FROM 
exam_results 
LEFT JOIN (
    SELECT 
    name, 
    surname, 
    MAX(date) AS last_passed_exam 
    FROM exam_results 
    WHERE result = 'PASS' 
    GROUP BY name, surname 
) AS last_passed_exams USING (name, surname) 
HAVING 
MAX(IF(exam_no = @query_exam_no, result, NULL)) = 'FAIL' 
GROUP BY name, surname 
0

select t.name, 
     t.surname, 
     t.date as 'date_since_failing' 
from tablename t 
inner join 
(
    select name, 
      surname, 
      max(exam_no) as exam_no 
    from tablename 
    group by name, surname 
    having min(result) = 'FAIL' 
) aux on t.name = aux.name and t.surname = aux.surname and t.exam_no = aux.exam_no 
0

あなたが求めている条件は、あなたができることは何のために良いですそれなし。ここに実例があります。

select 
    e.name, 
    e.sur_name, 
    min(e.date) as `LastFailed` 
from exams as e 
where e.result = 'Fail' 
group by e.name 
    order by e.name 

これは、あなたが誰かは最新の試験に合格した場合、彼らは彼らの最新のパスので、任意の試験に失敗していないという事実を利用することができ、この結果

name   sur_name LastFailed 
Ann   Evans  2012-02-03 
John  Doe   2012-02-01 
Mary  Lee   2012-01-04 
Ryan  Smith  2012-01-02 
+0

これは私が探している結果ではありません。日付は、私の質問の結果表に表示される日付でなければなりません。私が探しているのは、これらの生徒のそれぞれに連続して失敗した最新のバッチで最初に失敗した試験の日付です。 – Gabriel

+0

いいえ、申し訳ありません。私が探している結果は、私が最初に質問したものです。結果に合うように質問を編集しないでください。本当に無礼です。 – Gabriel

関連する問題