基于内部查询返回计数的UNION的有效方法?

时间:2014-01-21 03:33:08

标签: mysql sql union

我原本打算提出另一个问题,但是在弄乱了SQL小提琴后,我能够解决我的问题(无法证明效率)。

http://sqlfiddle.com/#!2/75c1b/4

目的是从有限的集合中询问用户“不好”的问题,并且一旦用尽,就从一堆从未尝试过的问题中提出问题。

是否有更有效的方法通过基于内部查询行计数的动态LIMIT来组织它,或者我是否应该在每个子查询中使用LIMIT以免耗费不必要的资源?

注意:最终的外部查询永远不会超过30行。

感谢@Squirrel向我展示了SQL Fiddle。

1 个答案:

答案 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;