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;