我有2个表,并且想要查找来自第一个表(标签)的ID在另一个表(article_labels)中出现多少次,但是还没有出现(我希望它在没有出现时返回0)。我使用MySQL和PHP。我更喜欢只涉及MySQL的解决方案。

这些表是:

LABELS (table 1)
+--+---------------+
|ID|EN             |
+--+---------------+
|1 |"Artert"       |
+--+---------------+
|2 |"Heart"        |
+--+---------------+
|3 |"Brain"        |
+--+---------------+


ARTICLE_LABELS (table 2)
+--+------------+
|ID|LABELID     |
+--+------------+
|1 |2           |
+--+------------+
|2 |1           |
+--+------------+
|3 |1           |
+--+------------+
|4 |1           |
+--+------------+
|5 |2           |
+--+------------+


我有一个运行正常的查询,但是即使标签表中的id未出现在article_labels表中(如上面标签表中id 3的情况),我也希望结果集中有一行。

我当前的查询是:

SELECT labels.id, en, COUNT( * ) AS used
FROM article_labels
LEFT JOIN labels ON labelid = labels.id
GROUP BY labelid


这将返回:

+--+---------------+
|ID|EN     |USED   |
+--+---------------+
|1 |Artery | 3     |
+--+---------------+
|2 |Heart  | 2     |
+--+---------------+


但正如预期的那样,由于它没有出现在article_labels表中,因此不会在结果集中显示labels.id 3。但是我不希望从标签表中返回“ id = 3”和“ en = Brain”的查询,即使该查询未出现在article_labels表中(结果看起来像这样):

+--+---------------+
|ID|EN     |USED   |
+--+---------------+
|1 |Artery | 3     |
+--+---------------+
|2 |Heart  | 2     |
+--+---------------+
|3 |Brain  | 0     |
+--+---------------+


有什么建议么?

最佳答案

您需要一个RIGHT JOIN而不是LEFT JOIN(或者交换表的加入顺序);您还需要命名要计数的列,因为要从联接中排除那些NULL的记录:

SELECT   l.id, COUNT(al.labelid) AS used
FROM     article_labels al RIGHT JOIN labels l ON al.labelid = l.id
GROUP BY l.id


要么

SELECT   l.id, COUNT(al.labelid) AS used
FROM     labels l LEFT JOIN article_labels al ON al.labelid = l.id
GROUP BY l.id


sqlfiddle上查看它们。

有关更多信息,请参见A Visual Explanation of SQL Joins

10-04 22:51
查看更多