Mysql 从具有2个左联接和1个复合主键的3个表进行计数

Mysql 从具有2个左联接和1个复合主键的3个表进行计数,mysql,logic,Mysql,Logic,我有三张这样的桌子 SecretAgents | id | name | |----|------| | 1 | A | | 2 | B | Victims | id | name | agent_id | |----|------|----------| | 1 | Z | 1 | | 2 | Y | 1 | | 3 | X | 2 | Data | id | keys | values | victim

我有三张这样的桌子

SecretAgents

| id | name |
|----|------|
| 1  |  A   |
| 2  |  B   |

Victims

| id | name | agent_id |
|----|------|----------|
|  1 |  Z   |   1      |
|  2 |  Y   |   1      |
|  3 |  X   |   2      |

Data
| id | keys | values | victim_id | form_id |
|----|------|--------|-----------|---------|
| 1  |  a1  |   x    |    1      |   1     |
| 2  |  a2  |   xx   |    1      |   2     |
| 3  |  a3  |   xxx  |    2      |   1     |
| 4  |  a5  |   xxx  |    1      |   1     |
我必须得到表单的数量(这里受害者id和表单id是复合主键)和每个代理的受害者数量

我对任何两个具有左联接和group by的表都尝试过这种方法,但我无法同时实现相同的效果。如果有人能慷慨地提供一个指针/解决方案,那就太棒了

编辑1:查询

这绝对不是正确的查询,但无论如何

SELECT count(DISTINCT v.id) as victimcount, `sa`.`username`, `sa`.`id`, count(DISTINCT d.form_id) as submissions
FROM `SecretAgents` as `sa`
LEFT JOIN `Victims` as `v` ON `v`.`agent_id`=`sa`.`id`
LEFT JOIN `Data` as `d` ON `d`.`victim_id`=`v`.`id`
GROUP BY `v`.`agent_id`
ORDER BY `sa`.`id` ASC
受害者人数正确,但提交人数错误。尝试了很多其他的东西,但这是最相关的


谢谢

我相信你可以像这样计算每个代理的表格:

SELECT COUNT(*) as form_count, a.id as id, a.name as agent 
    FROM Data d 
    LEFT JOIN Victims v ON v.id = d.victim_id
    LEFT JOIN SecretAgents a on v.agent_id = a.id
GROUP BY a.id;

要计算受害者人数,只需不填写数据表。

谢谢您的回复。此查询的问题是数据表存储键值对,而受害者id和表单id形成复合主键。我已经试过了,但这算错了。想到了一个在受害者和表单上使用group by的解决方案,但是group by代理丢失了。我越是觉得它越让人困惑…我尝试了很多方法,没有一种是正确的,但我仍然会粘贴错误的查询。也许有人会明白我的意思。。。