Mysql 一个id的多个左连接

Mysql 一个id的多个左连接,mysql,Mysql,在SQL操作方面,我并不太先进。我有一个横幅系统中的以下4个表格来宣传我的博客: banners -id -other irrelevant data clicks -id -bid (banner id) -other irrelevant data exits (people who clicked on the banner and never used the blog or registered an account) -id -bid postregistered (use

在SQL操作方面,我并不太先进。我有一个横幅系统中的以下4个表格来宣传我的博客:

banners 
-id
-other irrelevant data

clicks
-id
-bid (banner id) 
-other irrelevant data

exits (people who clicked on the banner and never used the blog or registered an account)
-id
-bid

postregistered (used the banner and register to the blog)
-id
-bid
现在我想生成一个简单的报告,显示每个横幅的
总点击次数
退出次数
注册次数

我试过这个:

SELECT COUNT(c.id) as clicks, COUNT(e.id) as exits, COUNT(r.id) as reg
FROM banners b
LEFT JOIN clicks c
ON c.bid = b.id
LEFT JOIN exits e
ON e.bid = b.id
LEFT JOIN registered r
ON r.bid = b.id
GROUP BY b.name
但它只会让mysql杀死我的处理器,而且永远不会完成,因为没有足够的数据让它成为一个繁重的查询

请你帮我一下,如果这看起来很基本的话,对不起

编辑:


我可以自己运行每个左连接并获得正确的结果,但我宁愿将其作为单个查询运行

您面临的问题是每个横幅的一个小笛卡尔积。简单来说,条幅id不足以链接表

假设你有10个横幅。每个横幅有100次点击。在这些点击中,有50次是退出,50次是注册。你可能认为你会从中得到大约1000行

不,你得到的是所有这些的乘积:10*100*50*50=2500000。这需要大量的处理

您需要某种类型的用户id来跟踪用户从单击到退出和注册。或者,您可以预先聚合查询:

select b.bid, b.name, numclicks, numexits, numreg
from banner b left outer join
     (select bid, count(*) as numclicks
      from clicks
      group by bid
     ) c left outer join
     on c.bid = b.bid join
     (select bid, count(*) as numexits
      from exits
      group by bid
     ) e
     on e.bid = b.bid left outer join
     (select bid, count(*) as numreg
      from postregistered
      group by bid
     ) r
     on r.bid = b.bid

您面临的问题是每个横幅的一个小笛卡尔积。简单来说,条幅id不足以链接表

假设你有10个横幅。每个横幅有100次点击。在这些点击中,有50次是退出,50次是注册。你可能认为你会从中得到大约1000行

不,你得到的是所有这些的乘积:10*100*50*50=2500000。这需要大量的处理

您需要某种类型的用户id来跟踪用户从单击到退出和注册。或者,您可以预先聚合查询:

select b.bid, b.name, numclicks, numexits, numreg
from banner b left outer join
     (select bid, count(*) as numclicks
      from clicks
      group by bid
     ) c left outer join
     on c.bid = b.bid join
     (select bid, count(*) as numexits
      from exits
      group by bid
     ) e
     on e.bid = b.bid left outer join
     (select bid, count(*) as numreg
      from postregistered
      group by bid
     ) r
     on r.bid = b.bid

执行
EXPLAIN SELECT…
并发布结果和表结构。您尝试过不使用表名作为别名吗?执行
EXPLAIN SELECT…
并发布结果和表结构。您尝试过不使用表名作为别名吗?+1说得好。下面是一个可以添加到答案中的示例。这是可行的,只需239ms即可处理,比运行3个单独的查询要好得多。谢谢:D+1说得好。下面是一个可以添加到答案中的示例。这是可行的,只需239ms即可处理,比运行3个单独的查询要好得多。谢谢:D