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所以关键是你的结果,你的最终查询,在某些事情上是唯一的。两个表之间的关系是什么并不重要,只要在编写这些子查询时,您可以确保您是按照某种方式进行分组的。只要您的子查询可以根据使其行在最终查询中唯一的内容进行分组,您就可以了(因为这样您就可以使用该值将它们连接到主查询中)。谢谢--我尝试了一个新的查询,但没有完全理解。如果您有机会查看,我会在上面发布查询。