我原本打算提出另一个问题,但是在弄乱了SQL小提琴后,我能够解决我的问题(无法证明效率)。
http://sqlfiddle.com/#!2/75c1b/4
目的是从有限的集合中询问用户“不好”的问题,并且一旦用尽,就从一堆从未尝试过的问题中提出问题。
是否有更有效的方法通过基于内部查询行计数的动态LIMIT来组织它,或者我是否应该在每个子查询中使用LIMIT以免耗费不必要的资源?
注意:最终的外部查询永远不会超过30行。
感谢@Squirrel向我展示了SQL Fiddle。
答案 0 :(得分:1)
如果您需要第一个子查询中的所有内容,然后从第二个子查询中填写其余内容,则对结果集进行排序并对结果进行限制:
SELECT problem_id, name
FROM ((SELECT problem_id, name, 'bad' as which
FROM (SELECT r.problem_id, p.name, sum(r.value) as knowledge
FROM responses r JOIN
problem p
ON p.id = r.problem_id
GROUP BY r.problem_id
)
WHERE knowledge = 0
) union all
(SELECT id, name, 'new'
FROM problem p
WHERE p.id NOT IN (SELECT problem_id FROM responses)
GROUP BY p.id
)
) as final
ORDER BY which
LIMIT 30;