[英]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.