繁体   English   中英

连接列上的SQL筛选器查询

[英]SQL filter query on joined column

我有以下SQL,它选择所有ManifestoBatches,并为我提供每个批次项目(ManifestoItems)的计数:

SELECT m.Id, u.UserName, m.TotalRows, m.DateCreated, count(i.Id) as Items
 FROM ManifestoBatches as m
 left join ManifestoItems as i on m.Id = i.BatchId
 inner join AmzUsers as u on m.CreatedBy = u.Id
 GROUP BY m.Id
 ORDER BY Items DESC
 LIMIT 0, 10

这很好用; 但是,我只想计算具有ManifesoItems.ScannerId属性不等于null的ManifestoItems。

因此,我尝试添加以下内容:

where NULLIF(i.ScannerId, '') is not null

但是,这将过滤整个结果集,并且只给我ManifestoBatches,其中ManifestoItems.ScannerId不为null。 相反,我希望它获取所有ManifestoBatches,但是只给我一个ManifestoItems的计数,其中ManifestoItems.ScannerId不为null。

我怎样才能做到这一点?

我认为您的问题是left join 当值不匹配时,将产生NULL 但是,听起来好像您在该字段中仍然有NULL值。 这可以解决您的问题:

SELECT m.Id, u.UserName, m.TotalRows, m.DateCreated, count(i.Id) as Items
FROM ManifestoBatches m join
     ManifestoItems i
     on m.Id = i.BatchId inner join
     AmzUsers u
     on m.CreatedBy = u.Id
WHERE i.ScannerId is not null
GROUP BY m.Id
ORDER BY Items DESC
LIMIT 0, 10;

如果仍然需要left join ,则将逻辑移至count()

SELECT m.Id, u.UserName, m.TotalRows, m.DateCreated, sum(i.ScannerId is not null) as Items
FROM ManifestoBatches m left join
     ManifestoItems i
     on m.Id = i.BatchId inner join
     AmzUsers u
     on m.CreatedBy = u.Id
GROUP BY m.Id
ORDER BY Items DESC
LIMIT 0, 10;

sum(i.ScannerId is not NULL)

根据您的选择。

代替

count(i.Id) 

采用

SUM(CASE WHEN i.ScannerId IS NOT NULL THEN 1 ELSE 0 END)`

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM