SQL查询返回带有连接的重复行

时间:2016-08-17 06:59:08

标签: mysql sql database

类似的问题已被多次询问,但没有一个答案有助于这种情况,所以再次提出问题

我有一个包含以下结构的表(是的,这里没有唯一的键):

---------------------------------------------------------------
|a_number | a_status | b_status | ref_id | timepublished       |
|(text)   | (text)   | (text)   |(text)  | (datetime)          |
---------------------------------------------------------------
|1        | U        | U        | re1    | 2016-08-12 13:24:25 |
|1        | P        | U        | re1    | 2016-08-12 13:24:35 |
|1        | P        | P        | re1    | 2016-08-12 13:24:45 |
|2        | U        | U        | re2    | 2016-08-12 12:24:30 |
|2        | U        | F        | re1    | 2016-08-12 12:24:45 |
|4        | U        | U        | re3    | 2016-08-12 13:24:30 |
|4        | U        | U        | re4    | 2016-08-13 15:24:30 |
---------------------------------------------------------------

现在我要解决的问题是获取每个a_number的最新状态。所以CORRECT输出应该是:

---------------------------------------------------------------
|1        | P        | P        | re1    | 2016-08-12 13:24:45 |
|2        | U        | F        | re1    | 2016-08-12 12:24:45 |
|4        | U        | U        | re3    | 2016-08-12 13:24:30 |
|4        | U        | U        | re4    | 2016-08-13 15:24:30 |
---------------------------------------------------------------

我的查询是:

SELECT af.a_number
     , af.a_status
     , af.b_status
     , af.ref_id
     , af.timepublished
FROM af_biz af
 JOIN
 (SELECT MAX(timepublished) timepublished, ref_id
     FROM af_biz GROUP BY ref_id) tmp 
 ON tmp.timepublished = af.timepublished AND tmp.ref_id = af.ref_id
ORDER BY af.a_number;

但是我得到的结果包含不正确的输出(注意时间是最大时间发布但状态不同):

---------------------------------------------------------------
|1        | P        | U        | re1    | 2016-08-12 13:24:45 |
|1        | P        | P        | re1    | 2016-08-12 13:24:45 |
|2        | U        | U        | re2    | 2016-08-12 12:24:45 |
|2        | U        | F        | re1    | 2016-08-12 12:24:45 |
|4        | U        | U        | re3    | 2016-08-12 13:24:30 |
|4        | U        | U        | re4    | 2016-08-13 15:24:30 |
---------------------------------------------------------------

任何人都知道我的查询有什么问题吗?

5 个答案:

答案 0 :(得分:1)

请试一试:

SELECT 
   af.a_number
 , af.a_status
 , af.b_status
 , af.ref_id
 , af.timepublished
FROM af_biz af
INNER JOIN 
(
    SELECT 
     a_number,
     MAX(timepublished) max_timepublished
    FROM af_biz 
    GROUP BY a_number
) AS t
ON af.a_number = t.a_number AND af.timepublished = t.max_timepublished
ORDER BY af.a_number

首先您需要按a_number进行分组。 (因为您需要每个a_number的结果)

第二次以后需要加入匹配timepublisheda_number (不是ref_id

答案 1 :(得分:1)

老式,但我使用了子查询

这是:

select 
   testtable.a_number
  ,testtable.a_status
  ,testtable.b_status
  ,testtable.timepublished
 from testtable
  inner join
 (   select
       a_number
      ,max(timepublished) as date
     from
       testtable 
     group by
       a_number ) as anumberWithMaxDate
 on 
   testtable.a_number = anumberWithMaxDate.a_number and 
   testtable.timepublished = anumberWithMaxDate.date 

答案 2 :(得分:0)

SELECT af.a_number, af.a_status, af.b_status, af.ref_id, af.timepublished
FROM af_biz af
 JOIN
 (
SELECT MAX(timepublished) timepublished, 
afb.a_number+ afb.a_status+ afb.b_status+ afb.ref_id as key
     FROM af_biz afb 
GROUP BY afb.a_number+ afb.a_status+ afb.b_status+ afb.ref_id
) tmp 
 ON tmp.timepublished = af.timepublished 
AND tmp.key = (af.a_number+ af.a_status+ af.b_status+ af.ref_id)
ORDER BY af.a_number;

答案 3 :(得分:0)

您的查询表达了与您想要的不同的内容。显然你对加入有一些误解。要解释您当前的查询:

您生成表单的中间表(refid,maxtimepublished),并且对于每个refid,您只有一个条目。这是您在加入中的正确表格。连接将匹配每个左行(原始表)与每个右行,匹配连接条件。

现在,refid=1的最长时间为2016-08-12 12:24:45,因此左表(原始)与refid=1timepublished='2016-08-12 12:24:45'的每一行都将以结果结束。这是第三和第五行。 重复refid=2,第四行也将输出。使用refid=3,最后一行将是输出。

这些是4行,与您声称的输出不匹配。但那可能只是一个错误。

我认为你必须对你的数据做一些假设。例如:

  

对于每个a_number,任何给定时间最多只能有一个条目(独立于ref_id

在这种情况下,您可以使用ref_id替换查询中的每个a_number并完成它。 (这也是1000111和Abhijit Chowdhury的回答)

答案 4 :(得分:0)

select 
    A_NUMBER,A_STATUS,B_STATUS,REF_ID,TIMEPUBLISHED
from  
    TABL
where 
    TIMEPUBLISHED in (select 
                          b.TIMEPUBLISHED
                      from 
                          (select 
                               A_NUMBER,max(TIMEPUBLISHED) as TIMEPUBLISHED
                           from TABL
                               group by A_NUMBER) b )
;