mysql - 根据 MA​​X(value) 有选择地聚合字段

标签 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,我希望获得一个结果,但如果 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 - 根据 MA​​X(value) 有选择地聚合字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44979664/

相关文章:

java - 插入数据时JDBC连接错误

sql - 如何使用 scala slick 3 发送纯 SQL 查询(并检索结果)

MySQL 删除 with where 不会报错

mysql - 查询计数(id)或按 id 排序哪个更便宜

mysql - 查询用户参加同一聚会的次数

MySql计算平均成绩

php - 如何使用mysqli->multi_query()?

python - 如何在 sqlite 中执行带有占位符的 SELECT * LIKE 语句?

mysql - 从 "in"函数 : 计算不同的答案值

MySQL - 相同的数据问题