我有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 |
+--+---------------+
有什么建议吗?
答案 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;