Mysql 连接3个表并选择count

Mysql 连接3个表并选择count,mysql,sql,database-design,count,jointable,Mysql,Sql,Database Design,Count,Jointable,我有3个表{网站}{账户}{广告} 网站表 id title url etc ----------------------------------- 1 site1 site1.com ... 2 site2 site1.com ... 3 site3 site3.com ... 账目表 id websiteID username etc ----------------

我有3个表{网站}{账户}{广告}

网站表

id     title    url           etc
-----------------------------------
1      site1    site1.com     ...
2      site2    site1.com     ...
3      site3    site3.com     ...
账目表

id     websiteID   username    etc
-----------------------------------
1      1           username1   ...
2      2           username2   ...
3      1           username1   ...
4      3           username5   ...
广告表

id     accountID   title    etc
---------------------------------
1      1           title1   ...
2      2           title1   ...
3      1           title3   ...
5      4           title4   ...
我想加入这3个表,从网站表开始,从网站表中获取一些数据,以及与其网站相关的帐户数和与其帐户相关的广告数。我还希望计数结果为零或空。 帐户表中的用户名不是唯一的,可以相同。 广告表中的标题也不是唯一的,可以是相同的

这是我的查询,但有时会返回错误的计数结果

SELECT 
    websites.id as website_id
,   websites.title as website_title
,   COUNT(accounts.websiteID) as accounts_count
,   COUNT(ads.accountID) as ads_count
,   ads.lastUpdate
,   websites.activation as website_activation 
FROM websites 
LEFT JOIN accounts 
    ON websites.id = accounts.websiteID 
LEFT JOIN ads 
    ON accounts.id = ads.accountID
GROUP BY websites.id;
你能帮我吗{

我想在如下表格中显示此结果:

website_title     accounts_count   ads_count    last update  operations
-------------------------------------------------------------------------
website1           3               8            2017/07/27   etc...
website2           0               0            2017/07/27   etc...
website3           3               9            2017/07/27   etc...
website4           5               15           2017/07/27   etc...

问题是当你加入
网站
账户时,你会得到
账户
中每一行的行数。然后当你加入
广告
时,你会进一步乘以行数。我猜你现在得到的
账户
广告
的行数是相同的。此外,你还有来自
ads
表格,并带有agregate功能。

似乎计数需要更改。
SELECT websites.id as website_id, websites.title as website_title,  
   ads.lastUpdate, websites.activation as website_activation 
   COUNT(accounts.websiteID) as accounts_count, COUNT(ads.accountID) as ads_count, 
FROM websites, accounts, ads
WHERE websites.id = accounts.websiteID 
   AND accounts.id = ads.accountID;
而ads.lastUpdate的最大值会更准确

F.e


期望的输出是什么从结果中添加一个样本期望的输出查看您的选择我不知道您是否真的知道您想要什么。如果您的选择包含
ads.lastUpdate
,那么您真正需要计算的结果是什么?显示期望的输出,您尝试实现i添加的输出我想要实现您可以询问我的答案,什么在您的查询中,您发现您错过了GROUPBY中的某些字段,当应用聚合函数时,应该考虑所有列,除了那些没有。aggregating@AlirezaKafi请注意,在此版本中,lastUpdate也会与MAX进行聚合。并且,
计数(不同值)
会对不为null的唯一值进行计数。
SELECT 
    websites.id as website_id
,   websites.title as website_title
,   COUNT(DISTINCT accounts.ID) as accounts_count
,   COUNT(ads.ID) as ads_count
,   MAX(ads.lastUpdate) as LastUpdateAds
,   websites.activation as website_activation 
FROM websites 
LEFT JOIN accounts 
    ON websites.id = accounts.websiteID 
LEFT JOIN ads 
    ON accounts.id = ads.accountID
GROUP BY websites.id;