选择查询以根据另一个表计算结果

时间:2014-06-15 18:53:40

标签: mysql sql

我有两个表,一个有成员列表,另一个有成员已完成的调查列表。

我需要根据他们成员的数量来计算成员完成的调查数量。例如,我想拉出所有已在2个月内注册的成员,然后计算这些成员完成的调查数量。

每个成员都有一个唯一的member_id,它存储在成员表中,也存储在已完成调查的表中 - 因此我可以在调查表中搜索member_id来计算已完成的数量。

此外,会员表存储了注册日期,可用于仅选择过去两个月的新会员。

我希望这是有道理的。我不知道如何发布表结构(来自PhpMyAdmin)。

提前非常感谢你。

2 个答案:

答案 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 演示。