首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL:从查询中获取平均值

MySQL:从查询中获取平均值
EN

Stack Overflow用户
提问于 2020-09-24 03:03:59
回答 2查看 79关注 0票数 1

我有三张桌子。

代码语言:javascript
复制
Users --> UID, Name, Lat, Longg, Pic
Profile --> pid, uid,City, State, About
Feedback--> fid, uid, ratingby, txnid, rating, feedback_type

Feedback_type可以是来自同一个txnid的1-4。因此,如果用户为所有问题提供反馈,那么将有4条相同的记录。

现在,我需要显示用户的详细信息和平均反馈。

下面是我到目前为止编写的查询。

代码语言:javascript
复制
SELECT
                    a.name,
                    a.uid,
                    b.city,
                    a.pic,
                    b.state,
                    b.about
                FROM
                    users AS a
                INNER JOIN profile AS b
                ON
                    a.uid = b.uid

我不知道如何从反馈表中得到平均值。

我需要显示用户的平均反馈和更具体的。所有4种反馈的平均值分别。

此外,建议我的方法是好的,或有任何其他最佳实践,我需要遵循。

编辑

我可以从反馈中提取单张唱片。

代码语言:javascript
复制
SELECT uid, avg(rating) FROM `feedback` WHERE uid= 8

但不确定如何才能得到不同feedback_type的平均值。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-24 04:03:28

您可能需要创建一个子表,以从反馈表中查找每种类型的平均评分(可以通过使用feedback_typegroup by f.uid, f.feedback_type进行分类以计算平均值)。在此之后,您只需要将结果查询表与用户和配置文件表连接起来,就可以获得其他数据,如Name、City等。

代码语言:javascript
复制
SELECT u1.Name, ar.uid, ar.average_rating, ar.feedback_type, p.City, u1.Pic, p.State, p.About
FROM (
  SELECT f.uid, f.feedback_type, AVG(f.rating) AS average_rating
  FROM Feedback AS f
  WHERE f.uid=8
  GROUP BY f.uid, f.feedback_type
) AS ar
INNER JOIN Users AS u1 ON ar.uid=u1.UID
INNER JOIN Profile AS p ON ar.uid=p.uid;

更新:如果别名不起作用,另一种方法是创建一个临时表来计算用户的平均评分,并使用该表与上面的用户和配置文件表连接

代码语言:javascript
复制
CREATE TEMPORARY TABLE ar
SELECT uid, feedback_type, AVG(rating) AS average_rating
FROM Feedback
WHERE uid=8
GROUP BY uid, feedback_type;

SELECT Users.Name, ar.uid, ar.average_rating, ar.feedback_type, Profile.City, Users.Pic, Profile.State, Profile.About
FROM ar
INNER JOIN Users ON ar.uid=Users.UID
INNER JOIN Profile ON ar.uid=Profile.uid;

更新:如果您需要将4种反馈类型的记录放在不同的列中,则只需在ar表中按ar分组,并使用AVG中的CASE筛选出每个列中的平均值。

代码语言:javascript
复制
CREATE TEMPORARY TABLE ar
SELECT 
    uid,
    AVG(CASE WHEN feedback_type = 1 THEN rating END) AS average_rating_1,
    AVG(CASE WHEN feedback_type = 2 THEN rating END) AS average_rating_2,
    AVG(CASE WHEN feedback_type = 3 THEN rating END) AS average_rating_3,
    AVG(CASE WHEN feedback_type = 4 THEN rating END) AS average_rating_4
FROM Feedback
WHERE uid=8
GROUP BY uid;

SELECT
    Users.Name,
    ar.uid,
    ar.average_rating_1,
    ar.average_rating_2,
    ar.average_rating_3,
    ar.average_rating_4,
    ar.feedback_type,
    Profile.City,
    Users.Pic,
    Profile.State,
    Profile.About
FROM ar
INNER JOIN Users ON ar.uid=Users.UID
INNER JOIN Profile ON ar.uid=Profile.uid;
票数 2
EN

Stack Overflow用户

发布于 2020-09-24 04:18:50

可以使用此查询SELECT AVG(column_name) FROM table_name WHERE condition;获取avg值。要获得更多的列,您应该尝试

代码语言:javascript
复制
SELECT AVG(column_name_1) AS a, AVG(column_name_2) AS b, AVG() AS c, AVG() AS d FROM table_name WHERE condition

希望我能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64038941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档