LEFT-JOIN和WHERE在查询中无法按预期工作

时间:2019-05-12 06:21:50

标签: mysql sql left-join inner-join

我有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    |
+---------+------+

2 个答案:

答案 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 )