Mysql 连接3个表并选择count
我有3个表{网站}{账户}{广告} 网站表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 ----------------
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;