2015-10-19 48 views
1

我有3代表这样计数联接和1复合主键

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  | 

我得的形式的计数(这里victim_id和form_id是复合主键),把计数每个代理人的受害者。

我已经尝试了这个任何2表与左连接和组,但我不能够实现在一起。如果任何人都可以慷慨地提供了一个指针/解决方案,这将是超真棒..

编辑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 

受害人数是正确的,但提交数量变得错误。试过很多其他事情太多,但是这是最相关的...

感谢

+0

告诉我们你的疑问? – Alex

+0

我已经尝试了很多方法,它们都不是正确的,但我仍然会粘贴错误的查询。也许有人可能会得到我缺少的观点... – Arcanyx

回答

1

我相信你可以指望的形式,每剂像这样:

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; 

计数的受害者,只是放弃数据表。

+0

感谢您的回复。该查询的问题是数据表存储键值对,而victim_id和form_id形成复合主键。我曾试过这个,但是这给了一个错误的计数。想到在受害者和表格上使用group by的解决方案,但随后由agent进行的group is lost。我越想越容易混淆...... – Arcanyx