MySQL 过滤空值并符合 ONLY_FULL_GROUP_BY 的聚合函数
MySQL aggregate function to filter nulls and conform with ONLY_FULL_GROUP_BY
我有一条记录连接到 N 个其他表,并从每个表中提取一个列。我想将这些提取的列的所有 N 放在一条记录中。
下图建好后,似乎可以轻松进入第二步,然后我应该可以使用聚合函数过滤掉NULL
。我四处寻找类似 GROUP_COALESCE
的东西,但我找不到可以实现这一点的东西。
我这里有一个 fiddle 不幸的是,它可以工作,因为 MySQL 会让你 select 不在 GROUP BY
中的列,而没有你自己的聚合危险 http://sqlfiddle.com/#!9/304992/1/0.
有没有一种方法可以确保它总是 select记录中的列(如果记录存在)?
最终结果应该是每组一条记录,每列将包含该组成功加入的唯一行内的值。
如果我没听错,您可以只对来自连接表的列使用聚合函数。聚合函数忽略空值,因此,由于每一列和每一组都有两个空值和一个非空值,这将 return 预期输出(同时符合 ONLY_FULL_GROUP_BY 选项)。
SELECT
group_table_id,
MAX(t1.v) t1_v,
MAX(t2.v) t2_v,
MAX(t3.v) t3_v
FROM group_table
LEFT JOIN t1 ON t1.group_id = group_table_id
LEFT JOIN t2 ON t2.group_id = group_table_id
LEFT JOIN t3 ON t3.group_id = group_table_id
GROUP BY group_table_id
我有一条记录连接到 N 个其他表,并从每个表中提取一个列。我想将这些提取的列的所有 N 放在一条记录中。
下图建好后,似乎可以轻松进入第二步,然后我应该可以使用聚合函数过滤掉NULL
。我四处寻找类似 GROUP_COALESCE
的东西,但我找不到可以实现这一点的东西。
我这里有一个 fiddle 不幸的是,它可以工作,因为 MySQL 会让你 select 不在 GROUP BY
中的列,而没有你自己的聚合危险 http://sqlfiddle.com/#!9/304992/1/0.
有没有一种方法可以确保它总是 select记录中的列(如果记录存在)?
最终结果应该是每组一条记录,每列将包含该组成功加入的唯一行内的值。
如果我没听错,您可以只对来自连接表的列使用聚合函数。聚合函数忽略空值,因此,由于每一列和每一组都有两个空值和一个非空值,这将 return 预期输出(同时符合 ONLY_FULL_GROUP_BY 选项)。
SELECT
group_table_id,
MAX(t1.v) t1_v,
MAX(t2.v) t2_v,
MAX(t3.v) t3_v
FROM group_table
LEFT JOIN t1 ON t1.group_id = group_table_id
LEFT JOIN t2 ON t2.group_id = group_table_id
LEFT JOIN t3 ON t3.group_id = group_table_id
GROUP BY group_table_id