如何解决MySQLv5.7.30查询AVG的AVG
所以我有这两个表:
职位:
-------------------------------------------------
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
--------------------------------------------------------------------------------------
我想选择一个特定business_id的工作,并将该business_id的总体评级附加到每个工作中,以AVG((AVG(专业),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,"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,"val":"Carpenter"}') )
AND NOT JSON_CONTAINS(workers,"fullname":"Cip"}')
AND NOT JSON_CONTAINS(applicants,"fullname":"Cip"}')
)
ORDER BY start_date LIMIT 3
和错误:
Unknown column 'jobs.business_id' in 'where clause'
解决方法
我认为您需要聚合和窗口功能:
select
business_id,rank() over(
order by avg(professional) + avg(communication) + avg(safety)
) as rn
from businesses_ratings
group by business_id
您可以根据需要用其他列来扩展窗口函数的order by
子句。
我对按3个平均值进行排名感兴趣,但我对此表示怀疑-但以上查询似乎可以合理地解释您的要求。
在早期版本中,一个选项使用用户定义的变量来计算排名:
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;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。