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