SELECT DISTINCT 查询花费的时间太长 SQL

SELECT DISTINCT query taking too long SQL

下面是我的代码,执行起来需要很长时间。当我添加 SELECT DISTINCT 时,它变得很长。

我想要做的是获得满足这些条件的独特公司,并计算每个公司有多少团队(这是由 team_id 给出的,在 [=20= 中给每个用户]你table).

任何帮助都会很棒,我想学习如何进行更好的 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;

那么,我相信每个用户都属于一个团队;即具有 auth_user.team_id 的一个值。并且您希望您的结果集显示公司有多少团队。

所以用 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 和聚合函数。你花在更好地学习这些概念上的每一秒都会对你有所帮助。

就性能而言,让它工作,然后再问另一个问题。用 and read this before you ask it.

标记