如何限制UNION ALL查询的结果?

时间:2015-10-11 16:06:44

标签: mysql limit union-all

我有这样的查询:

select col1, col2 from table1 where col1 = ?
union all
select col1, col2 from table2 where col2 = ?

现在我需要限制上述查询的结果,现在我想知道,如果我在第二个limit之后使用select子句,那么只需要第二个select的结果是限制的还是select的结果?

无论如何,哪种方法有利于限制union all查询的结果?

一:

select col1, col2 from table1 where col1 = ?
union all
select col1, col2 from table2 where col2 = ?
limit ?,10

两个

select * from
    (
    select col1, col2 from table1 where col1 = ?
    union all
    select col1, col2 from table2 where col2 = ?
    ) x
limit ?,10

2 个答案:

答案 0 :(得分:1)

从性能角度来看,第一个更好。第二个实现子查询,这是额外的开销。

注意:您使用的limit没有order by,因此从查询执行到下一次查询的结果可能不一致。

您应该使用order by,这可能与您使用的版本无关(因为order by无论如何都需要读取和写入数据。)

答案 1 :(得分:1)

根据MySQL manual

  

使用ORDER BY或LIMIT子句对整个UNION进行排序或限制   结果,括起单个SELECT语句并放置   最后一个之后的ORDER BY或LIMIT。

因此,您可以使用:

(select col1, col2 from table1 where col1 = ?)
union all
(select col1, col2 from table2 where col2 = ?)
LIMIT ?, 10

使用子查询也应该有效,但与上述查询相比,效率更高。