如何获得每个用户多次给出解决方案的平均值(查询)

时间:2014-04-09 01:50:26

标签: mysql sql database

假设我有这些表:

用户:id

问题:id

解决方案:id,user_id,problem_id

如何获得每个用户解决每个问题的次数?

我的结果集中需要这样的东西:

user_id  problem_id  times
-------  ----------  -----
1        1           3
1        2           4
2        2           8
2        3           1

然后我需要解决每个问题的平均时间:

problem_id  avg
----------  ---
1           3
2           6
3           1

我认为它类似于:

SELECT problem_id, avg(times) as avg from
       (SELECT user_id, problem_id, count(*) as times FROM solution
               group by user_id) sample
       group by problem_id;

但结果集看起来并不合适。我不知道......

1 个答案:

答案 0 :(得分:0)

以下查询将为您提供第一个表中指定的结果

SELECT 
    user_id
    , problem_id
    , COUNT(*) AS times
FROM
    solution
GROUP BY
    user_id
    , problem_id

对我来说第二个查询似乎有些奇怪,似乎你得到了用户回答该问题类型的平均次数(但不是我判断你的要求的地方)。如前所述,您的查询几乎就在那里,它应该给出一个关于GROUP BY子句中提供的参数的错误警告,不包括未包含在聚合函数中的所有返回列。

SELECT 
    problem_id
    , AVG(times) AS avg 
FROM
    (  SELECT 
           user_id
           , problem_id
           , COUNT(*) AS times
       FROM
            solution
       GROUP BY
           user_id
           , problem_id
    ) userCounts
GROUP BY 
    problem_id;

或者,如果您想避免子查询,则应按以下方式处理:

SELECT 
    problem_id
    , (COUNT(DISTINCT id) / COUNT(DISTINCT user_id)) AS avg 
FROM
    solution
GROUP BY 
    problem_id;

上述查询均在以下SQL Fiddle

中展示