我有一个非常大的联合查询,它产生以下结果:
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
答案 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