我的表格解决方案:id,user_id,problem_id correct,date,tries
正确可以是真或假
日期是解决方案保存的日期
和尝试次数是用户提交解决方案的次数
user_id problem_id tries correct
------- ---------- ----- --------
1 1 1 true
1 2 1 false
1 2 2 false
1 2 3 false
1 3 1 false
1 3 2 false
1 3 3 true
1 3 4 false
我需要在第一个正确的解决方案之前获得用户的尝试次数, 所以我试过这个:
SELECT problem_id, tries FROM solution
where user_id= and correct = true
group by problem_id order by date;
这给出了第一个正确解决方案之前的尝试次数,但仅适用于至少一次正确的解决方案。
problem_id tries
---------- -----
1 1
3 3
即使用户从未有过正确的解决方案,我也需要查看尝试次数。 我怎么能一起得到这两个结果呢?
problem_id tries
---------- -----
1 1
2 3
3 3
答案 0 :(得分:1)
可能使用子查询(未测试): -
SELECT problem_id, IF(b.user_id IS NULL, 0, COUNT(*))
FROM solution a
LEFT OUTER JOIN
(
SELECT user_id, problem_id, MIN(date) AS min_date
FROM solution
WHERE correct = true
GROUP BY user_id, problem_id
) b
ON a.problem_id = b.problem_id
AND a.user_id = b.user_id
AND a.date < b.min_date
WHERE a.user_id = ?
GROUP BY problem_id
编辑 - 玩过测试数据后,我想我可能有一个解决方案。不确定是否有任何边缘情况但它失败了: -
SELECT a.user_id, a.problem_id, SUM(IF(b.user_id IS NULL OR a.date <= b.min_date, 1, 0))
FROM solution a
LEFT OUTER JOIN
(
SELECT user_id, problem_id, MIN(date) AS min_date
FROM solution
WHERE correct = 'true'
GROUP BY user_id, problem_id
) b
ON a.problem_id = b.problem_id
AND a.user_id = b.user_id
GROUP BY a.user_id, problem_id
这有一个子查询,用于查找具有正确解决用户问题的解决方案的最低日期,并将其与解决方案列表相连接。如果没有正确的解决方案,或者如果有正确的解决方案并且该正确解决方案的日期大于或等于此解决方案的日期,那么它的SUM为1或0,行计为1;
SQL在这里小提琴: -
答案 1 :(得分:0)
如果您提到的查询可以获得您想要的结果&#34;更正&#34;答案,得到&#34;不正确&#34;数字,只是UNION您的查询与自身的有效副本调整正确= true到正确=假谓词。