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
和聚合函数。你花在更好地学习这些概念上的每一秒都会对你有所帮助。
就性能而言,让它工作,然后再问另一个问题。用 query-optimization and read this before you ask it.
标记
下面是我的代码,执行起来需要很长时间。当我添加 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
和聚合函数。你花在更好地学习这些概念上的每一秒都会对你有所帮助。
就性能而言,让它工作,然后再问另一个问题。用 query-optimization and read this before you ask it.
标记