计算两个表中的相关字段

时间:2014-02-16 12:52:30

标签: mysql

我有这两张桌子。

FOO

+----+--------+
| id | letter | 
| 1  | A      | 
| 2  | B      | 
| 3  | C      |
| 4  | D      |
+----+--------+

+----+------+--------+--------+
| id | name | foo_id | status |
| 1  | fox  | 1      | 1      |
| 2  | cat  | 1      | 0      |
| 3  | dog  | 3      | 1      |
| 4  | bird | 5      | 1      |
| 5  | cow  | 5      | 0      |
+----+------+--------+--------+

现在,我想计算条形图中字母的出现次数,只有状态等于1

所以LEFT JOIN陈述

The LEFT JOIN keyword returns all rows from the left table (table1), with the matching rows in the right table (table2). The result is NULL in the right side when there is no match.

这是我想要的结果。

+--------+-------+
| letter | count |
| A      | 1     |
| B      | 0     |
| C      | 1     |
| D      | 0     |
| E      | 1     |
+--------+-------+

到目前为止我的尝试。

SELECT letter, count(foo_id) AS count
FROM foo f LEFT JOIN bar b on f.id = b.foo_id
GROUP BY letter

我知道我的查询错误,因为它不会使用1过滤状态。但是当我尝试将WHERE status = 1添加到我的查询中时。似乎关闭。

要达到我想要的结果的查询是什么?

1 个答案:

答案 0 :(得分:1)

您需要将过滤器添加到连接谓词:

SELECT letter, count(foo_id) AS count
FROM   foo f 
       LEFT JOIN bar b 
         ON f.id = b.foo_id 
         AND b.status = 1
GROUP BY letter;

将它放在where子句中会有效地将左连接转换为内连接,因为bar中没有匹配,最终会得到WHERE NULL = 1,这不是真的,所以<{1}}中的此记录将不会被退回。