我有一个非常大的联合查询,它产生以下结果:
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,我希望获得一个结果,但如果 MAX(is_live)=1,则该 title_id
会获得所有结果>.) 这是我想要的结果集的示例,以及每个标题的解释:
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
最佳答案
您可以使用变量来做到这一点:
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 Fiddle。
关于mysql - 根据 MAX(value) 有选择地聚合字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44979664/