【问题标题】:DISTINCT and AVG in mysql query [closed]mysql 查询中的 DISTINCT 和 AVG [关闭]
【发布时间】:2018-10-04 16:54:40
【问题描述】:

我有这个 mysql 查询:

SELECT round(AVG(DISTINCT points),0) as PM
FROM data
WHERE points != 0

在数据数据库中,我有几个用户属于不同的地区。每个用户可以在任意多个区,但每个区的积分是相同的,所以,我们可以:

User , District , Points
   1 ,        1 ,     20 
   1 ,        3 ,     20 
   1 ,       21 ,     20 
   2 ,        3 ,     10
   2 ,        7 ,     10

我想提取上表的平均分,但只计算每个用户一次,不管他在多少个区。

通过我的查询,我只得到了不同点的那些,但是,例如,如果我有一个 10 点的用户 3,查询将返回:15 (20+10 = 30/2 = 15),而不是正确值:13 (20+10+10 = 40 / 3 = 13,3333)。

有什么帮助吗?

非常感谢!

【问题讨论】:

  • 嗨草莓...你错过了什么?你需要什么来帮助我?让我知道,我可以提供。我认为提供了所需的一切。谢谢。
  • 您可能应该考虑重构您的表结构。如果每个用户在他们所在的每个区都有完全相同的积分,那么(user, points)(user, district) 应该是单独的表。

标签: mysql database average


【解决方案1】:
  • 首先,使用group by 获取Derived table 中每个用户的积分。
  • 现在,使用派生表计算平均值。您现在不需要使用Distinct

尝试(假设用户由列 user_id 表示 - 如果不同,请更改):

SELECT ROUND(AVG(`dt`.`user_points`),0) as PM 
FROM 
(
  SELECT `user_id`, 
         MAX(`points`) AS `user_points`  
  FROM `data`
  WHERE `points` != 0 
  GROUP BY `user_id` 
) AS `dt`

【讨论】:

  • 尝试这个查询我得到以下错误:字段列表中的列 dt.points 是未知的
  • @saysmus 你不应该得到那个错误。无论如何我已经更新了答案,请再次检查
  • @saysmus 我有user_id 作为用户的列名。请根据您的数据库进行相应更改。
  • 非常感谢@Madhur Bhaiya,这是完美的工作!谢谢!!
  • @saysmus 乐于提供帮助 :)
【解决方案2】:

您是否在查询结束时尝试过GROUP BY

Working Online Sample Demo at SQLFiddle

构建架构...

CREATE TABLE UserPoints (
  id INT(11) NOT NULL AUTO_INCREMENT,
  Userid INT(11) NOT NULL DEFAULT 0,
  Districtid INT(11) NOT NULL DEFAULT 0,
  PointsCount INT(11) NOT NULL DEFAULT 0,
  PRIMARY KEY (id)
);

插入一些示例数据...

INSERT INTO UserPoints (Userid, Districtid, PointsCount) VALUES (1, 1, 10);
INSERT INTO UserPoints (Userid, Districtid, PointsCount) VALUES (1, 2, 20);
INSERT INTO UserPoints (Userid, Districtid, PointsCount) VALUES (2, 1, 12);

然后用 GROUP BY 选择...

SELECT Userid, AVG(PointsCount) FROM UserPoints GROUP BY Userid;

结果...

Userid  AVG(PointsCount)
1       15
2       12

【讨论】:

  • 嗨@HoldOffHunger,非常感谢您抽出宝贵的时间。那不是我需要的。我需要整个表格的平均分,而不是每个用户。我也可以轻松获得这些值。
猜你喜欢
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
  • 2012-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多