我有这样的查询:
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
答案 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
使用子查询也应该有效,但与上述查询相比,效率更高。