右连接表状态与成员数的数量与where / having条件

时间:2014-07-07 08:47:56

标签: mysql sql

我有两个表,一个是成员另一个是member_status表。我需要获得处于相同状态的成员数量。

构件

+----+-------------+-----------+---------+--------+--------+--------------+---------+---------------------+---------------------+
| id | full_name   | mobile_no | address | status | remark | edit_user_id | user_id | created_at          | updated_at          |
+----+-------------+-----------+---------+--------+--------+--------------+---------+---------------------+---------------------+
|  1 | John Doe    | 123       |         | 1      |        |            1 |       1 | 2014-06-19 15:51:08 | 2014-06-19 15:51:08 |
|  2 | Michael Bay | 123       |         | 1      |        |            1 |       1 | 2014-06-19 15:51:08 | 2014-06-19 15:51:08 |
|  3 | Hey Hey     | 123       |         | 3      |        |            1 |       1 | 2014-06-19 15:51:08 | 2014-06-19 15:51:08 |
+----+-------------+-----------+---------+--------+--------+--------------+---------+---------------------+---------------------+

member_status

+----+---------------------+----------------------+--------+--------------+---------+---------------------+---------------------+
| id | name                | description          | status | edit_user_id | user_id | created_at          | updated_at          |
+----+---------------------+----------------------+--------+--------------+---------+---------------------+---------------------+
|  1 | Visitor             | Visitor              | 1      |            1 |       1 | 2014-06-19 15:51:08 | 2014-06-19 15:51:08 |
|  3 | Member              | Member               | 1      |            1 |       1 | 2014-06-19 15:51:08 | 2014-06-19 15:51:08 |
|  4 | Level 1             | Level 1              | 1      |            1 |       1 | 2014-06-19 15:51:08 | 2014-06-19 15:51:08 |
| 11 | Level 12            | Level 12             | 1      |            1 |       1 | 2014-07-03 17:27:00 | 2014-07-03 17:27:00 |
+----+---------------------+----------------------+--------+--------------+---------+---------------------+---------------------+

我曾尝试过这个查询,但它不是正确的输出......

select `member_status`.`name`, count(member.id) as totalNum
from member WHERE member.created_at between '2014-06-01 00:00:00' and '2014-07-31 23:59:59'
right join `member_status` on (member.`status` = `member_status`.id) 
group by `member_status`.name

这是输出我想拥有它

+---------------------+----------+
| name                | totalNum |
+---------------------+----------+
| Level 1             |        0 |
| Level 12            |        0 |
| Member              |        1 |
| Visitor             |        2 |
+---------------------+----------+

然而,不知何故,输出是这一个,我想要所有的输出

+---------------------+----------+
| name                | totalNum |
+---------------------+----------+
| Member              |        1 |
| Visitor             |        2 |
+---------------------+----------+

有人可以提供建议吗?

3 个答案:

答案 0 :(得分:2)

SELECT      MS.name, 
            count(M.id) as totalNum           
FROM        member_status MS
LEFT JOIN   (SELECT * FROM member WHERE created_at between '2014-06-01 00:00:00' and '2014-07-31 23:59:59') M ON M.[status]  = MS.id
GROUP BY    MS.name

你必须像上面一样LEFT JOIN。

我刚编辑了代码。请参阅。

答案 1 :(得分:0)

选择     MS.name,COUNT(*)AS totalNum
从     member_status MS
    LEFT JOIN成员M ON MS.id = M.status     和     M.created_at在'2014-06-01 00:00:00'和'2014-07-31 23:59:59'之间 通过...分组     MS.name ORDER BY totalNum

答案 2 :(得分:0)

另一个答案是将where条件置于ON条件下

select `member_status`.`name`, count(member.id) as totalNum
from member WHERE 
right join `member_status` on (member.`status` = `member_status`.id AND member.created_at between '2014-06-01 00:00:00' and '2014-07-31 23:59:59') 
group by `member_status`.name