查找SQL json列中值平均值的多列平均值
Posted
技术标签:
【中文标题】查找SQL json列中值平均值的多列平均值【英文标题】:Finding multiple column average of the average of values in SQL json column 【发布时间】:2018-07-12 23:39:24 【问题描述】:假设我有一个包含以下格式数据的数据库
| id | name | rating |
-----------------------------------------------------------------|
| 1 | first | "looks": 20, "quality": 20, "quantity": 20|
-----------------------------------------------------------------|
| 2 | second | "looks": 30, "quality": 40, "quantity": 20|
------------------------------------------------------------------
首先,我需要获取 json 对象中每个项目的评分平均值。例如,获取 looks
、quality
和 quantity
的平均值,用于项目 first
和 second
。第一项的平均评分为 20,
并且项目second
的平均评分为30。然后得到这两个项目的平均评分,即20
和30
,最终结果为25。
我想使用 Laravel、Eloquent 查询构建器来实现它,但我不介意以原始 sql 格式获取它。我正在使用 Postgres 数据库。
我找到了this 答案,但它只使用单个键而不是多行来处理 json。任何帮助将不胜感激。
【问题讨论】:
你知道JSON列中的所有键吗? 是的,我知道所有的钥匙。它们对于所有行都是相同的。 您应该尝试在单独的列中进行此类计算 我同意...但是这已经在生产中的实时系统上。 虽然你得到了答案,但是对于 100 或 1000 行来说太慢了。 【参考方案1】:你可以使用集合:
$collection = Model::get();
$ratings = $collection->map(function($i)
return collect(json_decode($i->rating))->avg();
);
并且您想在结果中添加平均评分:
$collection = Model::get();
$collection->transform(function($i)
$i->average = collect(json_decode($i->rating))->avg();
return $i;
);
【讨论】:
是否可以在查询生成器中提供此解决方案?在调用 get 方法之前我可以在哪里过滤结果?以上是关于查找SQL json列中值平均值的多列平均值的主要内容,如果未能解决你的问题,请参考以下文章