【问题标题】:Merge not-blank result fields by sql query通过sql查询合并非空白结果字段
【发布时间】:2013-11-07 07:54:14
【问题描述】:

假设我有一个复杂的查询,它从大量表中获取数据。

    SELECT
    DISTINCT
        table1.hash, 
        table2.field1,
        table3.field1,
        table4.field1, 
...
...
...
    FROM table1
    inner JOIN table2
    ON table1.hash=device_model.hash 
        and table1.date = table2.date 
        and table1.time = table2.time

...
...
...
    inner JOIN table_n-1
    ON table1.hash=table_n-1.hash 
        and table1.date = table_n-1.date 
        and table1.time = table_n-1.time
    left JOIN table_n
    ON table1.hash=table_n.hash 
        and table1.date = table_n.date 
        and table1.time = table_n.time
...
...
...
    ORDER BY table1.date

感谢“DISTINCT”运算符,我得到了三行的结果,例如

+---------+----------+------------+
|value1   |Null      | value3     |
+---------+----------+------------+ 
|value1   |Null      | Null       |
+---------+----------+------------+ 
|value1   |value2    | null       |
+---------+----------+------------+ 
|value1   |Null      | value3     |
+---------+----------+------------+ 

所以我在每一行中至少有一个 Null。 如何将选择结果合并为一行以获取所有数据? 我想看看:

+---------+----------+------------+ 
|value1   |value2    | value3     |
+---------+----------+------------+

显然第一行的 value3 等于最后一行的 value3。 因此,结果行只是 Null 的不同。

【问题讨论】:

  • GROUP BY value1Field before ORDER
  • 如果您只对第一列执行GROUP BY,您仍然会得到重复的结果。也许GROUP BY 在所有列上?

标签: mysql sql join distinct


【解决方案1】:

您要求的是分组和使用 max 聚合函数的问题。假设你有这个表(你的查询很大,要粘贴在这里:):

+---------+---------+----------+------------+
|hash     |field1   |field2    | field3     |
+---------+---------+----------+------------+
|hash01   |value1   |Null      | value3     |
|hash01   |value1   |Null      | Null       |
|hash01   |value1   |value2    | null       |
|hash01   |value1   |Null      | value3     |
+---------+---------+----------+------------+

您可以按哈希列分组并在其余列上应用max。这样,value2 将优先于 field2 中的 null,而value3 将再次优先于 field3 中的 null。在此示例中,有 2 个value3 用于相同的哈希。所以max 函数仍然可以工作。如果同一列中的同一个哈希有 2 个不同的值,那么您应该澄清您想对它们做什么,因为在结果中只能选择一个(根据您的示例)。

所以对上述结果的查询应该是这样的:

select hash, max(field1) as field1, max(field2) as field2, max(field3) as field3
group by hash

将此应用于您的示例,很可能意味着您必须删除 distinct 子句并以与我在简化示例中相同的方式选择/分组结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多