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代理丢失了。我越是觉得它越让人困惑…我尝试了很多方法,没有一种是正确的,但我仍然会粘贴错误的查询。也许有人会明白我的意思。。。