我有3个表:residual_types,container,collections和collection_container。每个容器都有一个残差类型,并且容器和集合之间存在多对多的关系。
我需要进行查询,即在给定的一天中,即使没有与rinsant_type相关联的任何记录,也要告诉我每个residual_type收集了多少质量。例如,在给定的一天中,收集到的“ ORGANIC”残余类型为850千克,显示为“ ORGANIC | 850”,但是如果收集的千克为0千克,则显示为“ ORGANIC | 0”。
这是我正在使用的查询,但是它似乎不尊重collections.creation_time的WHERE子句,并且会带来所有记录
SELECT residual_types.name AS name, IFNULL(SUM(collection_container.mass),0) AS mass
FROM residual_types
INNER JOIN containers ON containers.residual_type_id = residual_types.id
INNER JOIN collection_container ON collection_container.container_id = containers.id
LEFT JOIN collections ON collection_container.collection_id = collections.id AND collections.creation_time BETWEEN 1557637200 AND 1557723599
GROUP BY residual_types.id
ORDER BY weight DESC
+---------+------+
| name | mass |
+---------+------+
| organic | 7580 |
+---------+------+
| paper | 1243 |
+---------+------+
| plastic | 123 |
+---------+------+
我也尝试过该查询,但是它没有带来任何记录。
SELECT residual_types.name AS name, IFNULL(SUM(collection_container.mass),0) AS mass
FROM residual_types
INNER JOIN containers ON containers.residual_type_id = residual_types.id
INNER JOIN collection_container ON collection_container.container_id = containers.id
INNER JOIN collections ON collection_container.collection_id = collections.id
WHERE collections.creation_time BETWEEN 1557637200 AND 1557723599
GROUP BY residual_types.id
ORDER BY weight DESC
如果没有与残留类型关联的任何集合,则结果集应如下所示:
+---------+------+
| name | mass |
+---------+------+
| organic | 0 |
+---------+------+
| paper | 0 |
+---------+------+
| plastic | 0 |
+---------+------+
答案 0 :(得分:1)
您的问题是,无论是否有集合,您求和的值将始终是数字。您需要以总和为条件来确定总和,您可以通过将表达式从
更改为该总和IFNULL(SUM(collection_container.mass), 0)
到
SUM(CASE WHEN collections.id IS NOT NULL THEN collection_container.mass ELSE 0 END)
答案 1 :(得分:0)
我认为问题在于设计,因为质量被保存在collection_container中。我会在收藏中期望它。效果是在左联接之前找到了质量(该联接在日期上失败了。)。
例如
foreach( GeometryObject obj in e.Objects )
{
Solid solid = obj as Solid;
if( null != solid )
{
foreach( Face face in solid.Faces )
{
PlanarFace pf = face as PlanarFace;
if( null != pf )