SQL - 重复相同的查询块

时间:2012-11-26 08:40:21

标签: mysql sql query-optimization

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:我想以有序的方式获得结果,因此第一个联合查询的结果必须保持在最顶层。

1 个答案:

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