在下面运行SQL时,placemarks表中没有id匹配的任何placemark_types.id都不会在结果中返回任何内容。 我试图至less得到一个0的type_count回来的地方没有匹配的logging。
所以,如果我有一个placemark_types.name的“警告”,并没有在地标表中的警告,ID喜欢得到列| 0 | 'Warning'| | 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
默认情况下,MySQL执行一个INNER JOIN ,其中只有两个表中有logging的行才被返回。
你可以做一个LEFT JOIN或RIGHT JOIN来告诉MySQL返回连接的一边,即使另一边是空的。 在这种情况下,你会想要一个RIGHT JOIN 。
最好总是指定你在做什么types的连接。 默认情况下它使用一个内部连接。 内部联接只会显示两个表中都匹配的项目。 在您的示例中,您需要从placemark_types返回的所有logging和匹配的地标表中的零到多个logging。
要做到这一点,只需使用左连接,如下所示。 左连接总是返回左侧的所有logging(placemark_types),而只返回右侧的匹配logging(地标)。 接下来让我们摆脱COUNT(*)并使用COUNT(placemarks.type_id),因为我们不想计算所有的行,只是在地标表中匹配的行。 否则你会得到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)不会计算空值,因此会给出正确的数字。