2013-04-17 29 views
1

我无法完全描述描述我的问题的问题。如果有另一行具有“更好”值,则从表中删除一行

但是...这就是我想实现

有存储出现了学生考试的结果的表。

Student Name |Roll Number| Subject | Result 

Andy   | 111  | Math | Fail 
Bob   | 112  | Science | Pass 
Carl   | 113  | History | Pass 
Andy   | 111  | Math | Pass 
Bob   | 112  | Science | Fail 
Bob   | 112  | History | Fail 
Carl   | 113  | History | Fail 

上面是一个MySQL表,我想删除体现一个“坏”的结果特定的行如果存在对同一个学生+主题组合一个“好”的结果另一行。 ie .. Andy第一次在数学上失败,但稍后通过。所以第一行应该被删除。而且,鲍勃有一次通过了科学,但在第二次尝试中失败了。所以第二次尝试应该被删除。

我想表:

Student Name |Roll Number| Subject | Result 

Bob   | 112  | Science | Pass 
Carl   | 113  | History | Pass 
Andy   | 111  | Math | Pass 
Bob   | 112  | History | Fail 
Carl   | 112  | History | Fail 

如果删除不能工作,也许插入的最佳值到另一个表,并截​​断这一个。

+0

什么被认为是“坏”,什么被认为是“好”? – brbcoding

+0

如果它是一个失败,这是不好的。如果它是一个合格的,它的好 –

+0

你想对这张表做一个永久的修改,或者你只是想影响查询中返回的结果吗?到目前为止,有两个答案,而且它们似乎都是双向的。 –

回答

1

利用所提供,你可以做到这一点作为一个聚合查询的数据:

select StudentName, RollNumber, Subject, 
     (case when MAX(Result = 'Pass') = 1 then 'Pass' else 'Fail' end) as Result 
from t 
group by StudentName, RollNumber, Subject 
+0

它仍然存储最新结果的值。 最新这里指的是表中最后一个值。 –

+0

忽略先前的评论。我的表格格式不正确。现在工作很好。谢谢。 –

1

使用MySQL的特殊multiple-table delete syntax

delete a 
from results a 
join results b 
    on b.roll_number = a.roll_number 
    and b.subject = a.subject 
    and b.result = 'Pass' 
where a.result = 'Fail' 

这只会删除,如果有匹配的通排故障行。如果有其他“好”的结果比“合格”,你将不得不相应调整条件。

相关问题