使用mysql表中的条件选择重复值

时间:2015-11-12 15:01:44

标签: mysql

我在mysql中有以下表格:

Key    DI     CI     FD      FA  NM  Valid_from   Valid_to
 0   1224468 123 2012-06-30  3   6   2013-01-23  9999-12-31
 1   1234567 123 2013-12-31  3   10  2014-02-27  2014-03-10
 2   1234567 123 2013-12-31  2   12  2014-03-10  9999-12-31
 3   1234579 123 2013-12-31  3   12  2014-05-15  9999-12-31
 4   1234595 123 2013-12-31  1   12  2014-06-30  9999-12-31
 5   122469  123 2015-11-11  1   6   2015-11-11  9999-12-31
 6   1224470 123 2015-11-11  2   12  2015-11-11  9999-12-31
 7   1224471 123 2015-11-11  3   15  2015-11-11  9999-12-31
 8   1224472 123 2015-11-10  2   13  2015-11-10  9999-12-31
 9   1224473 123 2015-11-10  3   12  2015-11-10  9999-12-31

如果有记录具有相同的“FD”,我需要得到“FA”为“1”的记录,如果存在的话。

基本上,我想要这个输出。

Key   DI     CI     FD      FA  NM  Valid_from   Valid_to
 0  1224468 123 2012-06-30  3   6   2013-01-23  9999-12-31
 4  1234595 123 2013-12-31  1   12  2014-06-30  9999-12-31
 5  122469  123 2015-11-11  1   6   2015-11-11  9999-12-31
 8  1224472 123 2015-11-10  2   13  2015-11-10  9999-12-31
 9  1224473 123 2015-11-10  3   12  2015-11-10  9999-12-31

我尝试了以下代码,但它提供了一个奇怪的输出:

代码:

SELECT T1.*
    FROM findoc T1 LEFT JOIN
     findoc T2
    ON DATE(T1.`Financial_date`) = DATE(T2.`Financial_date`) AND T2.`Fig_audit` <> 1
    WHERE  T2.`Fig_audit` IS NULL OR T1.`Fig_audit` = 1

输出:

Key   DI     CI     FD      FA  NM  Valid_from   Valid_to
 4  1234595 123 2013-12-31  1   12  2014-06-30  9999-12-31
 4  1234595 123 2013-12-31  1   12  2014-06-30  9999-12-31
 4  1234595 123 2013-12-31  1   12  2014-06-30  9999-12-31
 5  122469  123 2015-11-11  1   6   2015-11-11  9999-12-31
 5  122469  123 2015-11-11  1   6   2015-11-11  9999-12-31

它看起来很复杂,我无法做到。

我该怎么做?

感谢。

2 个答案:

答案 0 :(得分:1)

如果我理解你的问题(而且我不确定),你可以尝试这样的事情:

SELECT T1.*
    FROM findoc T1
   where T1.NM in (select distinct NM from findoc where FA = 1);

我假设NM是您想要返回所有结果的公共字段,如果这些FA条目的NM1。但这可能是一个错误的假设。

答案 1 :(得分:1)

您可以case based aggregation查看是否存在具有相同日期的行,并且至少有一行,FA的列值为1

select F.* from finddoc F
inner join 
(
select fd , sum( case when fa = 1 then 1 else 0 end) as faOneCount
from finddoc 
group by fd

) T
on (F.FD = T.FD and T.faOneCount = 1 AND F.FA =1)
or ( F.FD = T.FD and T.faOneCount =0 )