【问题标题】:GroupBy clause removing all null column valuesGroupBy 子句删除所有空列值
【发布时间】:2020-09-28 23:23:46
【问题描述】:

我编写了以下查询,其中我在 server 列上使用 groupby 子句

select s.server, MAX(s.ipAddress) as ipAddress, 
        MAX(r.stacks->>"$[0].name") as stackName,
        MAX(a.aMessage) as aMessage
        from environments e
        inner join servers s
            on e.objectId  = s.environmentId
        inner join resources r
            on e.objectId  = r.environmentId     
        inner join audits a
            on a.id  = (select max(a.id) from audits a where a.logObjId = s.cAudit)  
        WHERE dateSubmitted BETWEEN NOW() - INTERVAL 90 DAY AND NOW()
        Group by s.server
        ORDER BY dateSubmitted; 

但是,server 列可能具有 NULL 值,并且具有有效的 ipAddressstackName

如何修改查询,以免遗漏所有NULL server 列值。

预期样本数据:

server  ipAddress   stackName   aMessage
NULL    NULL    Stack A Searching for IP pool
NULL    NULL    Stack B Message XYZ
NULL    NULL    Stack A Message ABC

【问题讨论】:

  • 我怀疑是您的内部联接正在删除空值,而不是您的 group by。考虑将它们改为LEFT OUTER JOIN
  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。
  • 在这种情况下同意@philipxy。示例数据在这里会有很长的路要走,而且由于涉及到这么多表,因此示例数据可能是绝对必要的,以使您的问题可重现。
  • 推测您的服务器空值与内部连接相等性中提到的列中的空值出现在相同的行中,但是对于这些相等性为真并且要在连接中的行,列必须是非-null。
  • 在哪里?有 4 个表,它们没有样本数据。您需要做的是“简化它”(一次加入一个)并在进行过程中对其进行测试......

标签: mysql join select group-by inner-join


【解决方案1】:

似乎INNER JOIN 用于JOIN 表使NULL 值从结果中删除。所以只是修改了查询。试试这个,看看你是否能够看到Server 表的所有数据,这样NULL 的数据也会出现在Server 列中。

select s.server, MAX(s.ipAddress) as ipAddress, 
            MAX(r.stacks->>"$[0].name") as stackName,
            MAX(a.aMessage) as aMessage
            from servers s
            left join environments e
                on e.objectId  = s.environmentId
            left join resources r
                on e.objectId  = r.environmentId     
            left join audits a
                on a.id  = (select max(a.id) from audits a where a.logObjId = s.cAudit)  
            WHERE dateSubmitted BETWEEN NOW() - INTERVAL 90 DAY AND NOW()
            Group by s.server
            ORDER BY dateSubmitted; 

【讨论】:

  • 这仍然不起作用,因为我只看到一行 serverNULL
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 2014-09-24
  • 2017-12-08
  • 2022-07-19
  • 1970-01-01
相关资源
最近更新 更多