MySQL如何将结果平铺成一行,而不获取空值

MySQL如何将结果平铺成一行,而不获取空值,mysql,Mysql,我对MySQL查询非常陌生,不知道如何让数据以我想要的方式显示 我有三个表,通常看起来像这样,但是有更多的数据,最后的查询将不受我这里的一个主机名的限制。我只是想简化一下 基础设施服务器表 id | hostname 1 ld0007 基础结构\u服务器\u作业表 server_id | job_id 1 1 1 2 工作表 id | end_date 1 2015-12-21 09:51:56 2 2016-

我对MySQL查询非常陌生,不知道如何让数据以我想要的方式显示

我有三个表,通常看起来像这样,但是有更多的数据,最后的查询将不受我这里的一个主机名的限制。我只是想简化一下

基础设施服务器表

id | hostname
1    ld0007
基础结构\u服务器\u作业表

server_id  |  job_id
1             1
1             2
工作表

id  |  end_date
1      2015-12-21 09:51:56
2      2016-01-27 10:02:36
我的问题是:

SELECT
    CASE WHEN type = "provision" THEN CAST(end_date AS DATE) END AS ProvDate,
    CASE WHEN type = "decom" THEN CAST(end_date AS DATE) END AS DecomDate,
    infserver.hostname as HostName

FROM 
    infrastructure_server infserver

inner join infrastructure_server_jobs sj on infserver.id = sj.server_id
inner join jobs_job jj on sj.job_id = jj.id

where
infserver.status != "PROVFAILED"
AND
infserver.group_id ="2"
AND
infserver.hostname ="ld0007"
我的结果是:

ProvDate, DecomDate, HostName
'2015-12-21', NULL, 'ld0007'
NULL, '2016-01-27', 'ld0007'
如果我按主机名添加一个组,那么它会将其平铺成一行,但我会丢失DecomDate:

ProvDate, DecomDate, HostName
'2015-12-21', NULL, 'ld0007'
我需要的结果是每个主机名一行:

ProvDate, DecomDate, HostName
'2015-12-21', '2016-01-27', 'ld0007'
Thorsten,列类型在jobs\u job表中。我使用的工具是MySQl Workbench。如果我在运行查询时没有使用MAX()(在原始帖子中)并删除infserver.hostname='ld0007',那么下面是我得到的一些行

ProvDate, DecomDate, HostName
'2016-01-28', NULL, 'ld0043'
NULL, '2016-01-29', 'ld0043'
'2016-01-28', NULL, 'ld0044'
NULL, '2016-03-30', 'ld0044'
'2016-01-28', NULL, 'ld0045'
NULL, '2016-03-30', 'ld0045'
'2016-01-28', NULL, 'ld0046'
NULL, '2016-01-28', 'ld0046'
'2016-01-28', NULL, 'ld0047'
NULL, '2016-01-29', 'ld0047'
'2016-01-29', NULL, 'ld0048'
NULL, '2016-03-14', 'ld0048'
'2016-01-29', NULL, 'ld0049'
NULL, '2016-02-09', 'ld0049'
'2016-01-29', NULL, 'ld0050'
NULL, '2016-03-31', 'ld0050'
'2016-01-29', NULL, 'ld0051'
NULL, '2016-01-29', 'ld0051'
'2016-01-29', NULL, 'ld0052'
NULL, '2016-01-29', 'ld0052'
'2016-01-29', NULL, 'ld0053'
NULL, '2016-01-29', 'ld0053'
如果我给它添加一个计数器,我总共返回1989行。当我添加MAX()时,我只返回一条记录

SET @counter = 0;
SELECT
    (@counter:= @counter + 1) as counter,
    CASE WHEN type = "provision" THEN CAST(end_date  AS DATE) END AS ProvDate,
    CASE WHEN type = "decom" THEN CAST(end_date AS DATE) END AS DecomDate,
    infserver.hostname as HostName
FROM 
    infrastructure_server infserver
inner join infrastructure_server_jobs sj on infserver.id = sj.server_id
inner join jobs_job jj on sj.job_id = jj.id
where
infserver.status != "PROVFAILED"
AND
infserver.group_id ="2"

当按主机名分组时,每个主机名会得到一个结果行。例如,如果选择ProvDate,则会得到一个ProvDate-只要不指定哪个。因此,请使用聚合函数(如
MAX
)来说明要得到哪个。由于
MAX
忽略空值,这甚至可以解决整个问题:-)

选择
MAX(类型为'provision'时的情况),然后将(end_date AS date)end转换为ProvDate,
最大值(类型为'decom'时的情况),然后将(结束日期为日期)转换为DecomDate,
infserver.hostname作为主机名
从基础结构服务器infserver
infserver.id=sj.server\u id上的内部联接基础结构\u服务器\u作业sj
sj.job\u id=jj.id上的内部JOIN jobs\u job jj
其中infserver.status“PROVFAILED”
和infserver.group_id=2
而infserver.hostname='ld0007'
按infserver.hostname分组;

按主机名分组时,每个主机名会得到一个结果行。例如,如果选择ProvDate,则会得到一个ProvDate,只要不指定哪个。因此,使用一个聚合函数,例如
MAX
,来说明您想要得到哪一个。由于
MAX
忽略空值,这甚至解决了整个问题:-)

选择
MAX(类型为'provision'时的情况),然后将(end_date AS date)end转换为ProvDate,
最大值(类型为'decom'时的情况),然后将(结束日期为日期)转换为DecomDate,
infserver.hostname作为主机名
从基础结构服务器infserver
infserver.id=sj.server\u id上的内部联接基础结构\u服务器\u作业sj
sj.job\u id=jj.id上的内部JOIN jobs\u job jj
其中infserver.status“PROVFAILED”
和infserver.group_id=2
而infserver.hostname='ld0007'
按infserver.hostname分组;

column
type
在哪个表中?是的,聚合函数,例如
MAX
将行聚合为一个结果行。如果您希望每个主机名有一个结果行,那么请按答案中所示的主机名分组。谢谢,我刚刚意识到我在查询中遗漏了这一点。它在工作!!!再次感谢!列
type
在哪个表中?是的,聚合函数,例如
MAX
将行聚合到一个结果行。如果您希望每个主机名有一个结果行,那么请按答案中所示的主机名分组。谢谢,我刚刚意识到我在查询中遗漏了这一点。它在工作!!!再次感谢!
SELECT
  MAX(CASE WHEN type = 'provision' THEN CAST(end_date AS DATE) END) AS ProvDate,
  MAX(CASE WHEN type = 'decom' THEN CAST(end_date AS DATE) END) AS DecomDate,
  infserver.hostname as HostName
FROM infrastructure_server infserver
INNER JOIN infrastructure_server_jobs sj on infserver.id = sj.server_id
INNER JOIN jobs_job jj on sj.job_id = jj.id
where infserver.status <> 'PROVFAILED'
AND infserver.group_id = 2
AND infserver.hostname = 'ld0007'
group by infserver.hostname;