Mysql 涉及连续值的复杂SQL查询
我需要执行一个相对容易解释但(鉴于我的技能有限)很难编写SQL查询 假设我们有一个类似于此的表:Mysql 涉及连续值的复杂SQL查询,mysql,sql,database,Mysql,Sql,Database,我需要执行一个相对容易解释但(鉴于我的技能有限)很难编写SQL查询 假设我们有一个类似于此的表: exam_no | name | surname | result | date ---------+------+---------+--------+------------ 1 | John | Doe | PASS | 2012-01-01 1 | Ryan | Smith | FAIL | 2012-01-02 <-- 1
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 <--
如何执行这样的查询
谢谢您的时间。我应该使用一个子查询来获取上次通过的考试, 有点像:
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
这就足够了:
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
你所要求的条件是毫无用处的,没有它你是做不到的。下面是一个工作示例
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
您可以利用这样一个事实,即如果某人通过了最近一次考试,那么他们自最近一次通过以来没有任何考试不及格:因此,问题归结为发现自最近一次通过以来第一次考试不及格:
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
其他读者:注意,他将其标记为“MySQL”,认为您可以在result='FAIL'上加入同一个表,并从中选择日期最高的表。你试过什么?你说的“最近的考试”是什么意思?最新日期的考试?我说的“最新考试”是指考试成绩最好的考试。
考试编号
。我已经重写了我的答案,请检查它。这不是我想要的结果。日期应该是我问题中结果表中出现的日期。我要找的是这些学生最近一批连续不及格考试中第一次不及格的日期。不,对不起。我想要的结果正是我最初在问题中写的结果。请不要编辑我的问题,让它符合你的结果,这真的是不尊重。这正是它。我简直不敢相信它是多么的简洁和简单。我用最少的努力使它适应了我真正的问题。非常感谢你。
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