这是我下面的代码,执行起来需要很长时间。当我添加SELECT DISTINCT时,它会变得很长。
我试图做的是获得满足这些条件的唯一公司,并计算每个公司有多少个团队(这是由auth_useru表中给每个用户的team_id给出的(。
任何帮助都将是惊人的,我想学习如何制作更好的SQL查询。我知道GROUP BY是更好的方法,但我似乎不明白。
SELECT DISTINCT u.company_id, c.name, c.company_type, c.office_location, (SELECT (COUNT(DISTINCT u.team_id)) FROM auth_user u WHERE u.company_id = c.id GROUP BY u.company_id) as number_of_teams, s.status, h.auto_renewal
FROM auth_user u, companies_company c, subscriptions_subscription s, hubspot_company h
WHERE u.company_id = c.id
AND s.company_id = c.id
AND h.myagi_id = c.id
ORDER BY u.company_id ASC
首先重构查询,使用1992 JOIN语法,而不是爷爷的逗号联接语法。(我是爷爷,JOIN一上市,我就开始使用它。(
SELECT DISTINCT u.company_id, c.name, c.company_type, c.office_location,
count_of_teams_TODO,
s.status, h.auto_renewal
FROM auth_user u
JOIN companies_company c ON u.company_id = c.id
JOIN subscriptions_subscription s ON s.company_id = c.id
JOIN hubspot_company h ON h.myagi_id = c.id
ORDER BY u.company_id ASC;
那么,我相信每个用户都属于一个团队;即具有一个值CCD_ 1。你希望你的结果集显示公司有多少团队。
所以用COUNT(DISTINCT u.team_id) teams
代替我的count_of_teams_TODO
占位符,得到这个。不需要子查询。但对于聚合函数COUNT()
,我们需要GROUP BY
。我们希望按公司、状态和授权进行分组。
SELECT c.id, company_id, c.name, c.company_type, c.office_location,
COUNT(DISTINCT u.team_id) teams,
s.status, h.auto_renewal
FROM auth_user u
JOIN companies_company c ON u.company_id = c.id
JOIN subscriptions_subscription s ON s.company_id = c.id
JOIN hubspot_company h ON h.myagi_id = c.id
GROUP BY c.id, s.status, h.auto_renewal
ORDER BY u.company_id ASC;
研究GROUP BY
和聚合函数。你花在更好地学习这些概念上的每一秒都会对你有所帮助。
就性能而言,先解决这个问题,然后再问另一个问题。用查询优化标记它,并在询问它之前阅读它。