【问题标题】:Combining a LEFT JOIN with GROUP BY, whilst also including NULLs将 LEFT JOIN 与 GROUP BY 结合,同时还包括 NULL
【发布时间】:2012-06-14 10:58:11
【问题描述】:

我在使用 LEFT JOIN 和 GROUP BY 组合具有一对多映射的表时遇到问题。

我有一个带有唯一 ID 的下表(在说明性示例中是 house_number)

房屋:

|house_number| bedrooms|
|0           | 4       |
|1           | 3       |
|2           | 1       |

我想使用唯一 ID 与第二个表进行 LEFT JOIN,其中第二个表可能有也可能没有每个唯一 ID 的多个条目。例如,

住户:

| house_number | occupant_id | type    |
| 0            | 3           | 19      |
| 0            | 1           | 20      |
| 0            | 2           | 21      |
| 2            | 7           | 20      |

现在我想要实现的是每个门牌号只有一个条目,但在 LEFT JOIN 中优先考虑类型为 20 的居住者,同时保留那些没有列出任何居住者的房屋,例如,

|house_number| bedrooms| occupant_id | type    |
|0           | 4       | 1           | 20      |
|1           | 3       | null        | null    |
|2           | 1       | 7           | 20      |

我可以使用 GROUP BY 来实现每栋房屋只有一个条目,但是,我需要确保随它返回的居住者行(如果存在)具有type = 20

如果我只使用 WHERE (type = 20),那么我不会得到 house_number = 1 的返回条目。

我将如何进入决赛桌?

【问题讨论】:

  • 试试 WHERE (type = 20 OR type IS NULL)
  • 为了保留外连接,在ON子句中过滤右表。

标签: mysql sql group-by left-join


【解决方案1】:

试试WHERE (type = 20 OR type is null) 条件怎么样?

【讨论】:

    【解决方案2】:
    SELECT h.house_number,h.bedrooms
            , o.occupant_id,o.ztype
    FROM houses h
    LEFT JOIN occupants o ON h.house_number = o.house_number
            AND o.ztype =20
            ;
    

    顺便说一句,我不得不将“type”替换为“ztype”,因为 type 是 Postgres 中的保留字。

    【讨论】:

      猜你喜欢
      • 2022-01-08
      • 2021-12-10
      • 2021-11-06
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-11
      • 2021-01-30
      相关资源
      最近更新 更多