假设我有这些表:
用户: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;
但结果集看起来并不合适。我不知道......
答案 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
中展示