select * from ( select * from y where x="t") where z rlike "(.*)query1"
union
select * from ( select * from y where x="t") where z rlike "(.*)query2"
如上所示,括号通常包含相同的查询 返回多行结果。有没有办法通过只查询括号内的select语句并反复使用结果来优化它?
PS:我想以有序的方式获得结果,因此第一个联合查询的结果必须保持在最顶层。
答案 0 :(得分:3)
这里有三件事:
UNION
,请避免UNION ALL
。简单union
涉及删除重复项,因此需要更多时间。OR
。select * from (select * ...
是冗余的,可以避免。给出了:
SELECT *
FROM y
WHERE x = 't'
AND ( z RLIKE '(.*)query1'
OR
z RLIKE '(.*)query2'
)
正如melpomene的评论(谢谢!)所说,你甚至可以考虑正则表达式:
WHERE z RLIKE '(.*)query1|(.*)query2'
如果y
中存在重复但您不想要它们,由于UNION
放弃了它们,您可以引入DISTINCT
,但如果没有必要,请避免使用。
如果您想要订单,请不要依赖DBMS。使用ORDER BY
:
ORDER BY CASE WHEN z RLIKE '(.*)query1' THEN 1
WHEN z RLIKE '(.*)query2' THEN 2
ELSE 3 -- given the WHERE clause, should never happen
END