0
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:我想以有序的方式获取结果,所以第一个联合查询的结果必须保持在顶部。

4

1 回答 1

3

这里有三件事:

  • UNION首先,如果可以使用,请避免使用UNION ALL. Plain unions 涉及删除重复项,因此需要更多时间。
  • 当您可以考虑查询时,请执行此操作。在这里,除了一个标准之外,您有精确查询的联合,然后您可以使用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
于 2012-11-26T08:42:27.433 回答