使用相同的键合并一个数组(对象列表)

时间:2020-06-17 17:31:43

标签: php mysql

我正在尝试使用php / mysql开发一个评分系统。

我有一个简单的评级对象,如下所示: (t是评级类型,r是评级值)

  [{"t":"1","r":2},{"t":"2","r":4},{"t":"3","r":1},{"t":"4","r":2},{"t":"5","r":2}]

在DB中,我有很多评分记录 像这样:

     object1=> [{"t":"1","r":2},{"t":"2","r":4},{"t":"3","r":1},{"t":"4","r":2},{"t":"5","r":2}]

     object2=> [{"t":"1","r":1},{"t":"2","r":5},{"t":"3","r":3},{"t":"4","r":3},{"t":"5","r":1}]

简而言之,我需要一个这样的新对象(我需要使用相同的键来计算平均评分。)

objectAverageCalculated=> [{"t":"1","r":1.5},{"t":"2","r":4.5},{"t":"3","r":2},{"t":"4","r":2.5},{"t":"5","r":1.5}]

我的sql:

CREATE TABLE `ratings` (
  `id` int(11) NOT NULL,
  `rating` text NOT NULL,
  `item_id` varchar(16) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;



INSERT INTO `ratings` (`id`, `rating`, `item_id`) VALUES
(6, '[{\"t\":\"1\",\"r\":2},{\"t\":\"2\",\"r\":4},{\"t\":\"3\",\"r\":1},{\"t\":\"4\",\"r\":2},{\"t\":\"5\",\"r\":2}]', 'ABC123'),
(7, '[{\"t\":\"1\",\"r\":1},{\"t\":\"2\",\"r\":5},{\"t\":\"3\",\"r\":3},{\"t\":\"4\",\"r\":3},{\"t\":\"5\",\"r\":1}]', 'ABC123');


--
ALTER TABLE `ratings`
  ADD PRIMARY KEY (`id`);



ALTER TABLE `ratings`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8;
COMMIT;

我的代码

$result = mysqli_query($con, "SELECT * FROM ratings WHERE item_id='ABC123' ");
while ($row = mysqli_fetch_array($result)) {
    $tempArray = json_decode($row['rating'], true);
    array_push($ratingsRaw, $tempArray);
}

我无法用新变量(例如$ item1,$ item2等)保存每个对象

如何将每个对象存储在一个数组中,如何在一个输出对象中获取每种评级类型的平均值?

1 个答案:

答案 0 :(得分:1)

您可以在MySQL查询中使用AVG()方法,并直接从数据库中检索平均值。

SELECT AVG(rating) AS avg_rating FROM ratings WHERE item_id='ABC123'

或者当您未指定ID并且想要所有项目的平均值时。

SELECT AVG(rating) AS avg_rating, item_id FROM ratings GROUP BY item_id