我尝试通过查询而不是在服务器端解决此问题。
我有一个这样的表:
+----+-----------+--------+--------+
| ID | RateValue | Marker | Marked |
+----+-----------+--------+--------+
| 1 | 8 | USER1 | USER2 |
| 2 | 10 | USER2 | USER1 |
| 3 | 9 | USER3 | USER1 |
| 4 | 8 | USER1 | USER3 |
| 5 | 6 | USER2 | USER3 |
| 6 | 7 | USER3 | USER2 |
+----+-----------+--------+--------+
我想要一个查询,该查询返回每个标记用户的平均值。
USER1 被标记在第 2 行和第 3 行,总计为 9.5 (9+10/2)。
USER2 被标记在第 1 行和第 6 行,总计为 7.5。
到目前为止,我只能通过将其分为两个步骤来使其工作:
获取所有唯一标记的用户:
SELECT DISTINCT Marked FROM reviews
然后获取每个用户的 AVG:
SELECT AVG(rateValue) FROM reviews WHERE Marked = ?
我尝试将其结合起来,但它返回了我的总平均值:
SELECT Marked,AVG(rateValue) FROM reviews WHERE Marked IN (SELECT DISTINCT Marked FROM reviews)
但它会返回总平均值,我希望有一个查询可以返回每个不同标记用户的平均值。
最佳答案
简单地使用聚合:
select marked, avg(ratevalue)
from reviews
group by marked;
如果您想要不考虑列的平均值,请使用 union all
进行逆透视和聚合:
select user, avg(ratevalue)
from ((select marker as user, ratevalue
from reviews
) union all
(select marked as user, ratevalue
from reviews
)
) r
group by user;
这是通用 SQL。有些数据库有更有效的方法来反转两列。
关于MYSQL 选择每个不同条目的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58997201/