MySQL ( v5.7.30 ) 查询 AVG of AVGs
MySQL ( v5.7.30 ) query AVG of AVGs
所以我有这两个表:
职位:
-------------------------------------------------
id business_id other_columns
-------------------------------------------------
1 223 xxxxxx
-------------------------------------------------
1 12 xxxxxx
-------------------------------------------------
businesses_ratings:
--------------------------------------------------------------------------------------
id business_id professional communication safety respectful dependability
--------------------------------------------------------------------------------------
1 223 4 2 5 4 3
--------------------------------------------------------------------------------------
2 223 3 5 2 4 5
--------------------------------------------------------------------------------------
3 223 1 2 5 4 4
--------------------------------------------------------------------------------------
我想 select 特定 business_id 的工作,并在每个工作上附加 business_id 的总体评分,计算为 AVG((AVG(professional), AVG(沟通), AVG(安全), AVG(尊重), AVG(信赖))
我可以在一次查询中实现吗?
LE:我将在此处附加我尝试过的查询(还包含 WHERE 子句,也许它有助于更好地解释我需要实现的目标。还有抛出的错误:
SELECT * FROM jobs
CROSS JOIN (
SELECT count(*) totalJobs FROM jobs
WHERE (
( JSON_CONTAINS(skills, '{"id":1,"val":"Carpenter"}') )
AND NOT JSON_CONTAINS(workers, '{"id":6,"fullname":"Cip"}')
AND NOT JSON_CONTAINS(applicants, '{"id":6,"fullname":"Cip"}')
)
) ttl
CROSS JOIN (
SELECT AVG(
(SELECT AVG(professional) FROM businesses_ratings WHERE business_id=jobs.business_id) +
(SELECT AVG(communication) FROM businesses_ratings WHERE business_id=jobs.business_id) +
(SELECT AVG(safety) FROM businesses_ratings WHERE business_id=jobs.business_id) +
(SELECT AVG(respectful) FROM businesses_ratings WHERE business_id=jobs.business_id) +
(SELECT AVG(dependability) FROM businesses_ratings WHERE business_id=jobs.business_id)
) business_rating FROM businesses_ratings WHERE business_id=jobs.business_id
) avg
WHERE (
( JSON_CONTAINS(skills, '{"id":1,"val":"Carpenter"}') )
AND NOT JSON_CONTAINS(workers, '{"id":6,"fullname":"Cip"}')
AND NOT JSON_CONTAINS(applicants, '{"id":6,"fullname":"Cip"}')
)
ORDER BY start_date LIMIT 3
和错误:
Unknown column 'jobs.business_id' in 'where clause'
我认为您需要聚合和 window 函数:
select
business_id,
rank() over(
order by avg(professional) + avg(communication) + avg(safety)
) as rn
from businesses_ratings
group by business_id
您可以根据需要使用其他列扩展 window 函数的 order by
子句。
我对按 3 个平均值的平均值进行排名的兴趣持怀疑态度 - 但上述查询似乎是对您要求的合理解释。
在早期版本中,一个选项使用 user-defined 个变量来计算排名:
select t.*, @rn := @rn + 1 rn
from (
select
business_id,
avg(professional) + avg(communication) + avg(safety) sum_avg
from businesses_ratings
group by business_id
order by sum_avg
) t
cross join (select @rn := 0) x
您的查询似乎比必要的要复杂得多。我想你想要:
select br.business_id,
avg(professional),
avg(communication),
avg(safety),
avg(respectful),
avg(dependability),
(avg(professional) + avg(communication) + avg(safety) + avg(respectful) + avg(dependability)) / 5 as overall_avg
from businesses_ratings br
group by br.business_id;
所以我有这两个表:
职位:
-------------------------------------------------
id business_id other_columns
-------------------------------------------------
1 223 xxxxxx
-------------------------------------------------
1 12 xxxxxx
-------------------------------------------------
businesses_ratings:
--------------------------------------------------------------------------------------
id business_id professional communication safety respectful dependability
--------------------------------------------------------------------------------------
1 223 4 2 5 4 3
--------------------------------------------------------------------------------------
2 223 3 5 2 4 5
--------------------------------------------------------------------------------------
3 223 1 2 5 4 4
--------------------------------------------------------------------------------------
我想 select 特定 business_id 的工作,并在每个工作上附加 business_id 的总体评分,计算为 AVG((AVG(professional), AVG(沟通), AVG(安全), AVG(尊重), AVG(信赖))
我可以在一次查询中实现吗?
LE:我将在此处附加我尝试过的查询(还包含 WHERE 子句,也许它有助于更好地解释我需要实现的目标。还有抛出的错误:
SELECT * FROM jobs
CROSS JOIN (
SELECT count(*) totalJobs FROM jobs
WHERE (
( JSON_CONTAINS(skills, '{"id":1,"val":"Carpenter"}') )
AND NOT JSON_CONTAINS(workers, '{"id":6,"fullname":"Cip"}')
AND NOT JSON_CONTAINS(applicants, '{"id":6,"fullname":"Cip"}')
)
) ttl
CROSS JOIN (
SELECT AVG(
(SELECT AVG(professional) FROM businesses_ratings WHERE business_id=jobs.business_id) +
(SELECT AVG(communication) FROM businesses_ratings WHERE business_id=jobs.business_id) +
(SELECT AVG(safety) FROM businesses_ratings WHERE business_id=jobs.business_id) +
(SELECT AVG(respectful) FROM businesses_ratings WHERE business_id=jobs.business_id) +
(SELECT AVG(dependability) FROM businesses_ratings WHERE business_id=jobs.business_id)
) business_rating FROM businesses_ratings WHERE business_id=jobs.business_id
) avg
WHERE (
( JSON_CONTAINS(skills, '{"id":1,"val":"Carpenter"}') )
AND NOT JSON_CONTAINS(workers, '{"id":6,"fullname":"Cip"}')
AND NOT JSON_CONTAINS(applicants, '{"id":6,"fullname":"Cip"}')
)
ORDER BY start_date LIMIT 3
和错误:
Unknown column 'jobs.business_id' in 'where clause'
我认为您需要聚合和 window 函数:
select
business_id,
rank() over(
order by avg(professional) + avg(communication) + avg(safety)
) as rn
from businesses_ratings
group by business_id
您可以根据需要使用其他列扩展 window 函数的 order by
子句。
我对按 3 个平均值的平均值进行排名的兴趣持怀疑态度 - 但上述查询似乎是对您要求的合理解释。
在早期版本中,一个选项使用 user-defined 个变量来计算排名:
select t.*, @rn := @rn + 1 rn
from (
select
business_id,
avg(professional) + avg(communication) + avg(safety) sum_avg
from businesses_ratings
group by business_id
order by sum_avg
) t
cross join (select @rn := 0) x
您的查询似乎比必要的要复杂得多。我想你想要:
select br.business_id,
avg(professional),
avg(communication),
avg(safety),
avg(respectful),
avg(dependability),
(avg(professional) + avg(communication) + avg(safety) + avg(respectful) + avg(dependability)) / 5 as overall_avg
from businesses_ratings br
group by br.business_id;