【问题标题】:mysql average count from related table来自相关表的mysql平均计数
【发布时间】:2011-12-08 04:56:17
【问题描述】:

我有两张桌子:

用户表

用户列表

故事

故事列表 - 每个用户多个故事

我想知道用户拥有的平均故事数。 (不是特定用户,适用于所有用户)

预期结果:每位用户平均 2.3 个故事

试过了:

select avg(w) from (select count(distinct user_id) as w from stories group by user_id) a; 以上运行但似乎不正确

还有:

SELECT user_id, (SELECT COUNT(*) FROM stories w WHERE w.user_id = u.user_id) as TotalStories FROM user u;

返回每个用户的平均故事,而不是总体平均

【问题讨论】:

  • select avg(w) from (select count(distinct user_id) as w from stories group by user_id) a;
  • 以上运行但似乎不正确
  • SELECT user_id, (SELECT COUNT(*) FROM stories w WHERE w.user_id = u.user_id) as TotalStories FROM user u;
  • 通过编辑您的问题将其放入您的问题中,以便每个成员都可以查看。
  • 以上不做平均只返回整个用户列表的平均值

标签: mysql sql aggregate-functions


【解决方案1】:

首先您需要知道每个用户的故事数:

select count(s.id) as n
from users u left outer join stories s on u.id = s.user_id
group by u.id

然后将avg 应用到那个:

select avg(n)
from (
    select count(s.id) as n
    from users u left outer join stories s on u.id = s.user_id
    group by u.id
) as dt

【讨论】:

  • 这给了我'每个派生表必须有自己的别名'
  • @jhanifen:抱歉,忘记了“as dt”位。
  • 这也很有效,很高兴有两个单独的查询返回与测试相同的结果。
  • 有什么想法更好或更快?
  • @jhanifen:你必须对他们进行分析。使用avg 告诉数据库您的确切意图,这通常是您最好的选择;一般来说,你越能告诉数据库你究竟想要做什么,它就能越快地为你提供你想要的东西。如果您想要一个平均值,请向数据库索取一个;如果您想要标准差,请向数据库索取一个 (stddev_pop),...
【解决方案2】:
SELECT COUNT(userid) AS totalusers, SUM(storycount) AS totalstories, SUM(storycount) / COUNT(userid) AS average_stories
FROM (
    SELECT users.id AS userid, COUNT(stories.id) AS storycount
    FROM users
    LEFT JOIN stories ON (users.id = stories.user_id)
    GROUP BY users.id
) AS child

内部查询对每个用户的故事进行计数。外部查询计算总用户数、总故事数和每个用户平均的故事数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 2018-01-01
    相关资源
    最近更新 更多