Group By、COUNT(*) 和 JOIN

Group By、COUNT(*) 和 JOIN

运行以下 SQL 时,任何在地标表中没有 ID 匹配的 placemark_types.id 都不会在结果中返回任何内容。我试图至少在地标中没有匹配记录的情况下返回 type_count 为 0。

因此,如果我的 placemark_types.name 为“警告”,而 placemarks 表中没有“警告”,我想获取列| 0 | 'Warning'|

SELECT COUNT( * ) AS type_count, placemark_types.name
FROM  `placemark_types` 
JOIN placemarks ON placemark_types.id = placemarks.type_id
WHERE placemark_types.parent_id =0
GROUP BY placemark_types.id

答案1

默认情况下,MySQL 执行INNER JOIN,其中仅返回两个表中都有记录的行。

您可以执行LEFT JOINRIGHT JOIN来告诉 MySQL 返回连接的一侧,即使另一侧为空。在这种情况下,您需要一个RIGHT JOIN

答案2

最好始终指定您正在执行的连接类型。默认情况下,它使用内连接。内连接将仅显示在两个表中都匹配的项目。在您的示例中,您希望从 placemark_types 返回所有记录,并从 placemarks 表中返回匹配的零对多记录。

为此,只需使用如下所示的左连接。左连接始终返回左侧的所有记录(placemark_types),并仅返回右侧的匹配记录(placemarks)。接下来,让我们摆脱COUNT(*)并使用 COUNT(placemarks.type_id),因为我们不想计算所有行,只想计算 placemarks 表中匹配的行。否则,即使其中没​​有匹配项,您也会得到 1,因为它仍在计算 placemark_types。

SELECT COUNT(placemarks.type_id) AS type_count, placemark_types.name
FROM  placemark_types
LEFT JOIN placemarks ON placemark_types.id = placemarks.type_id
WHERE placemark_types.parent_id = 0
GROUP BY placemark_types.id

为了更好地理解这一点,请运行不带 的查询GROUP BY。您将看到,即使地标表中没有条目,您也会从 placemark_types 表中获取字段,并为地标字段获取空值。由于 不会COUNT(placemarks.type_id)计算空值,因此这将为您提供正确的数字。

相关内容