有选择地基于MAX(值)的聚合字段

时间:2017-07-07 21:09:28

标签: mysql sql

我有一个非常大的联合查询,它产生以下结果:

p_id       title_id        title        is_live

1          37              TITANIC      1
2          37              TITANIC      0

3          41              AVATAR       0
4          41              AVATAR       0

5          44              HOME ALONE   0

6          11              COMPUTE      1
7          11              COMPUTE      1
8          11              COMPUTE      1

从这个结果中,我想聚合它,以便我得到每个标题中的至少一个(title_id),但所有标题is_live = True。 (换句话说,对于每个title_id,如果MAX(is_live)= 0,我想得到一个结果,但如果title_id的MAX(is_live)= 1,则所有结果都会产生。)这是一个例子我想要的结果集,以及每个标题的解释:

p_id       title_id        title        is_live

1          37              TITANIC      1 // live one for titanic

3          41              AVATAR       0 # at least one of each title (which one doesn't matter)

5          44              HOME ALONE   0 /* at least one of each title */

6          11              COMPUTE      1 // keep all, since all are live
7          11              COMPUTE      1
8          11              COMPUTE      1

到目前为止,我的查询大致如下:

SELECT * FROM (
    80-line UNION query
) d
GROUP BY
  d.title_id

但这当然不够准确,更像是一个大纲。我怎么办?

以下是问题的SQLFiddle:http://sqlfiddle.com/#!9/739a36/2/0

2 个答案:

答案 0 :(得分:1)

您可以使用变量执行此操作:

select q.*
from (select q.*,
             (@rn := if(@t = title, @rn + 1,
                        if(@t := title, 1, 1)
                       )
             ) as rn
      from (<your query here>) q cross join
           (select @t := '', @rn := 0) params
      order by title, is_live desc
     ) q
where is_live = 1 or rn = 1;

Here是SQL小提琴。

答案 1 :(得分:1)

使用union all执行此操作的一种方法,首先选择所有is_live个真行,然后为之前未选择的title_id选择一个错误的is_live行。

select *
from `a`
where is_live
union all
select max(p_id),title_id,max(title),max(is_live)
from `a` a1
where not is_live 
and not exists (select 1 from `a` a2 
                where a1.title_id=a2.title_id and a2.is_live)
group by title_id