我有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。