返回一个表中的id出现在MySQL的另一个表中的次数(包括0次)

时间:2015-03-11 22:44:29

标签: mysql sql

我有2个表,想要查找第一个表(标签)中的id出现在另一个表(article_labels)中的次数,但是当它没有时(我希望它在它时返回0)没有按' T)。我使用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     |
+--+---------------+

但正如预期的那样,它并没有在结果集中显示labels.id 3,因为它没有出现在article_labels表中。但是,我想要一个也会返回" id = 3"和" en = Brain"来自标签表,即使它没有出现在article_labels表中(结果看起来像这样):

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

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您需要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

答案 1 :(得分:0)

对于子选择来说,这似乎是个好例子:

SELECT labels.id, 
  (SELECT COUNT(*) FROM article_labels WHERE labelid=labels.id) AS used
 FROM labels;