我有两个表,一个有成员列表,另一个有成员已完成的调查列表。
我需要根据他们成员的数量来计算成员完成的调查数量。例如,我想拉出所有已在2个月内注册的成员,然后计算这些成员完成的调查数量。
每个成员都有一个唯一的member_id,它存储在成员表中,也存储在已完成调查的表中 - 因此我可以在调查表中搜索member_id来计算已完成的数量。
此外,会员表存储了注册日期,可用于仅选择过去两个月的新会员。
我希望这是有道理的。我不知道如何发布表结构(来自PhpMyAdmin)。
提前非常感谢你。
答案 0 :(得分:0)
SELECT member_id, COUNT(*) AS completed_surveys
FROM member_table m
JOIN survey_completion_table s ON m.member_id = s.member_id
WHERE m.signup_date >= NOW() - INTERVAL 2 MONTH
GROUP BY m.member_id;
答案 1 :(得分:0)
如果您想列出所有成员,即使他们自注册日期以来未完成任何调查,您也必须使用外部联接(以下示例中为LEFT JOIN
:
SELECT m.member_id, COUNT(s.member_id) completed
FROM members m LEFT JOIN surveys s
ON m.member_id = s.member_id
WHERE m.signup_date >= CURDATE() - INTERVAL 2 MONTH -- or LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 2 MONTH depending on what exactly you mean by "within 2 months"
GROUP BY m.member_id;
示例输出:
| MEMBER_ID | COMPLETED | |-----------|-----------| | 2 | 1 | | 3 | 0 | | 4 | 2 |
更新:在同一查询中获取总计的最简单方法是将WITH ROLLUP
修饰符应用于GROUP BY
子句。
SELECT m.member_id, COUNT(s.member_id) completed
FROM members m LEFT JOIN surveys s
ON m.member_id = s.member_id
WHERE m.signup_date >= CURDATE() - INTERVAL 2 MONTH
GROUP BY m.member_id WITH ROLLUP
示例输出:
| MEMBER_ID | COMPLETED | |-----------|-----------| | 2 | 1 | | 3 | 0 | | 4 | 2 | | (null) | 3 |
NULL
列中member_id
的最后一行将包含总数。
以下是两个查询的 SQLFiddle 演示。