我有三张桌子。
Users --> UID, Name, Lat, Longg, Pic
Profile --> pid, uid,City, State, About
Feedback--> fid, uid, ratingby, txnid, rating, feedback_typeFeedback_type可以是来自同一个txnid的1-4。因此,如果用户为所有问题提供反馈,那么将有4条相同的记录。
现在,我需要显示用户的详细信息和平均反馈。
下面是我到目前为止编写的查询。
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种反馈的平均值分别。
此外,建议我的方法是好的,或有任何其他最佳实践,我需要遵循。
编辑
我可以从反馈中提取单张唱片。
SELECT uid, avg(rating) FROM `feedback` WHERE uid= 8但不确定如何才能得到不同feedback_type的平均值。
发布于 2020-09-24 04:03:28
您可能需要创建一个子表,以从反馈表中查找每种类型的平均评分(可以通过使用feedback_type对group by f.uid, f.feedback_type进行分类以计算平均值)。在此之后,您只需要将结果查询表与用户和配置文件表连接起来,就可以获得其他数据,如Name、City等。
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;更新:如果别名不起作用,另一种方法是创建一个临时表来计算用户的平均评分,并使用该表与上面的用户和配置文件表连接
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筛选出每个列中的平均值。
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;发布于 2020-09-24 04:18:50
可以使用此查询SELECT AVG(column_name) FROM table_name WHERE condition;获取avg值。要获得更多的列,您应该尝试
SELECT AVG(column_name_1) AS a, AVG(column_name_2) AS b, AVG() AS c, AVG() AS d FROM table_name WHERE condition希望我能帮上忙。
https://stackoverflow.com/questions/64038941
复制相似问题