Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何修复子查询以阻止左连接增加计数?_Mysql_Join_Count_Subquery_Left Join - Fatal编程技术网

Mysql 如何修复子查询以阻止左连接增加计数?

Mysql 如何修复子查询以阻止左连接增加计数?,mysql,join,count,subquery,left-join,Mysql,Join,Count,Subquery,Left Join,我有两张表:canvas和survey。下面是每个ID的示例模式——ID匹配并且每个ID都有一些有目的的副本 拉票表: ID Name Result ContactedBy DateContacted ContactType 1 Seinfeld, Jerry Contacted Bluth, Gob 3/5/15 Phone 2 Benes, Elaine Wrong Address Bluth, Gob

我有两张表:
canvas
survey
。下面是每个ID的示例模式——ID匹配并且每个ID都有一些有目的的副本

拉票表

ID  Name              Result        ContactedBy DateContacted ContactType
1   Seinfeld, Jerry   Contacted     Bluth, Gob     3/5/15   Phone
2   Benes, Elaine     Wrong Address Bluth, Gob     4/7/15   Walk
3   Costanza, George  Contacted     Bluth, Michael 9/15/15  Walk
4   Kramer, Cosmo     Contacted     Funke, Tobias  12/14/14 Walk
5   David, Larry      Contacted     Bluth, Michael 11/11/14 Walk
6   Puddy, David      Not Home      Bluth, Michael 4/9/15   Walk
7   Ross, Susan       Not Home      Funke, Tobias  4/19/15  Phone
1   Seinfeld, Jerry   Contacted     Bluth, Gob     9/15/15  Walk
9   Costanza, Frank   Not Home      Funke, Tobias  3/30/15  Walk
10  Cohen, Ruthie     Call Back     Funke, Tobias  12/3/12  Phone
ID  Name             SurveyId   DateContacted ContactType   ContactedBy
1   Seinfeld, Jerry  99         3/5/15        Phone         Bluth, Gob
2   Benes, Elaine    99         4/7/15        Walk          Bluth, Gob
3   Costanza, George 99         9/15/15       Walk          Bluth, Michael
4   Kramer, Cosmo    88         12/14/14      Walk          Funke, Tobias
5   David, Larry     99         11/11/14      Walk          Bluth, Michael
6   Puddy, David     88         4/9/15        Walk          Bluth, Michael
7   Ross, Susan      11         4/19/15       Phone         Funke, Tobias
1   Seinfeld, Jerry  99         9/15/15       Walk          Bluth, Gob
9   Costanza, Frank  99         3/30/15       Walk          Funke, Tobias
10  Cohen, Ruthie    11         12/3/12       Phone         Funke, Tobias
调查表

ID  Name              Result        ContactedBy DateContacted ContactType
1   Seinfeld, Jerry   Contacted     Bluth, Gob     3/5/15   Phone
2   Benes, Elaine     Wrong Address Bluth, Gob     4/7/15   Walk
3   Costanza, George  Contacted     Bluth, Michael 9/15/15  Walk
4   Kramer, Cosmo     Contacted     Funke, Tobias  12/14/14 Walk
5   David, Larry      Contacted     Bluth, Michael 11/11/14 Walk
6   Puddy, David      Not Home      Bluth, Michael 4/9/15   Walk
7   Ross, Susan       Not Home      Funke, Tobias  4/19/15  Phone
1   Seinfeld, Jerry   Contacted     Bluth, Gob     9/15/15  Walk
9   Costanza, Frank   Not Home      Funke, Tobias  3/30/15  Walk
10  Cohen, Ruthie     Call Back     Funke, Tobias  12/3/12  Phone
ID  Name             SurveyId   DateContacted ContactType   ContactedBy
1   Seinfeld, Jerry  99         3/5/15        Phone         Bluth, Gob
2   Benes, Elaine    99         4/7/15        Walk          Bluth, Gob
3   Costanza, George 99         9/15/15       Walk          Bluth, Michael
4   Kramer, Cosmo    88         12/14/14      Walk          Funke, Tobias
5   David, Larry     99         11/11/14      Walk          Bluth, Michael
6   Puddy, David     88         4/9/15        Walk          Bluth, Michael
7   Ross, Susan      11         4/19/15       Phone         Funke, Tobias
1   Seinfeld, Jerry  99         9/15/15       Walk          Bluth, Gob
9   Costanza, Frank  99         3/30/15       Walk          Funke, Tobias
10  Cohen, Ruthie    11         12/3/12       Phone         Funke, Tobias
我的桌子比上面两张桌子大得多,也更凌乱,但它应该能给人一个想法。下面是一个我希望结果看起来如何的快速示例(尽管我无法通过下面的查询得到):

如果我按表分别运行计数(无论是在一个查询中还是在使用子查询中),我都会得到正确的结果——但如果我尝试将它们放在一个表中,由于
左连接,所有计数都会非常膨胀。我知道这是因为人们有比我关心的更多的调查,这重复了每个ID的数量——但我不太明白如何阻止它

这是我在查询方面的最佳尝试——尽管正如我上面所说的——尽管它的查询和生成的结果与上面所希望的表相似,但它过度膨胀了所有计数:

SELECT a.contactedby, SUM(Knocked), SUM(Contacted), SUM(88), SUM(99)
FROM (SELECT c.id cid,
    c.contactedby,
    c.result,
    c.contacttype,
    c.datecontacted,
    COUNT(c.id) Knocked,
    COUNT(CASE WHEN c.result = "Contacted" THEN c.id ELSE NULL END) Contacted,
    s.id sid,
    s.surveyid,
    COUNT(CASE WHEN s.surveyid = 88 THEN s.id ELSE NULL END) 88,
    COUNT(CASE WHEN s.surveyid = 99 THEN s.id ELSE NULL END) 99
    FROM canvass c
    LEFT JOIN survey s ON s.id = c.id AND RIGHT(s.datecontacted,2)="15" AND s.contacttype = "Walk" AND s.contactedby = c.contactedby
    WHERE RIGHT(c.datecontacted,2)="15" AND c.contacttype = "Walk"
    GROUP BY c.id, c.contactedby
    ORDER BY c.contactedby
) AS a
GROUP BY a.contactedby;
如果您能帮助解决此问题,我们将不胜感激!游戏的最后一步是从查询中获得我关心的调查结果,而忽略任何一个表中2015年不是通过散步获得的结果

--

我尝试了另一个基于下面发布的有用文章的查询,虽然我没有得到错误,结果与我想要的完全一样,敲/联系的数字也不错,但88和99次调查大多为
NULL
s,并填充了一些随机数。以下是查询:

SELECT c.contactedby contby, COUNT(CASE WHEN c.id IS NOT NULL THEN c.id ELSE NULL END) Knocked, COUNT(CASE WHEN c.result = "Contacted" THEN c.id ELSE NULL END) Contacted, s.88, s.99
FROM canvass c
LEFT JOIN
    (
        SELECT s1.id sid, s1.contactedby contby1, COUNT(DISTINCT CASE WHEN s1.surveyid = 88 THEN s1.id ELSE NULL END) 88, COUNT(DISTINCT CASE WHEN s1.surveyid = 99 THEN s1.id ELSE NULL END) 99
        FROM survey s1
        GROUP BY contby1
    ) AS s ON s.sid = c.id
WHERE RIGHT(c.datecontacted,2) = "15" AND c.contacttype = "Walk"

简短版本:不能在同一个查询中同时聚合两个表

您需要编写两个子查询,根据您希望在主查询中唯一的内容进行分组,然后将它们连接在一起


要了解我前一段时间为同事写的更详细、更详细的解释,请阅读这篇关于您遇到的问题的文章。它有查询的例子和一切

呸!谢谢总比试着让它再工作几个小时却一无所获要好。您是否可以提供更多的解释,说明由谁编写按我的主查询分组在一起的两个子查询?我不知道我以前是否做过子查询。事实上,我写了那篇关于分组陷阱的文章,我已经尽可能清楚了。它有查询示例和所有内容。过来看!读了你的文章后的最后一个问题:如果这两个表有多对多的关系,我会倒霉吗?在上面描述的两个例子中,每个人/id都有多行,因为他们大部分都被敲过/拉票过很多次,并且大部分都回答了多个调查。它们的主键显然是匹配的——但是你的文章让我觉得如果不是一对多,我可能会有麻烦。@Ryan所以关键是你的结果,你的最终查询,在某些事情上是唯一的。两个表之间的关系是什么并不重要,只要在编写这些子查询时,您可以确保您是按照某种方式进行分组的。只要您的子查询可以根据使其行在最终查询中唯一的内容进行分组,您就可以了(因为这样您就可以使用该值将它们连接到主查询中)。谢谢--我尝试了一个新的查询,但没有完全理解。如果您有机会查看,我会在上面发布查询。