基本上我有这个查询:
( SELECT * FROM tbl WHERE type = 'word1' )
UNION
( SELECT * FROM tbl WHERE type = 'word2' ) // Run this query if there are no results with type = 1
基本上我只想在第一个没有任何结果的情况下运行第二个查询。是否可以?
第一个“PreCheck”查询计算有多少条记录是类型 = 1。之后,如果计数大于 1,则返回 1,否则返回 2。
现在,该答案可用于连接(始终是通过 COUNT(*) 的单行),其值可能为 1 或 2。该值将是第二个值是 EQUALITY 条件。所以,如果有一个 1 的条目,结果就像
其中 t1.Type = 1
因此决不允许在测试中出现任何 2。但是,如果没有找到任何条目,它的值为 2,因此会创建一个 WHERE 子句
其中 t1.type = 2
select t1.*
from
( select if( count(*) > 0, 1, 2 ) IncludeType
from tbl t2
where t2.type = 1 ) preCheck,
tbl t1
where
t1.type = preCheck.IncludeType
如果“类型”列上有索引,则第一个查询应该几乎是瞬时的。
你可以写
select * from tbl
where type = 1
union
select * from tbl
where type = 2
and not exists( select * from tble where type = 1 )
但这可能不会像在您的程序中那样执行
它可以解决问题:
SELECT tbl.* FROM tbl JOIN (SELECT min(type) min_type FROM tbl WHERE type between 1 and 2 ) on min_type = type
首先,它选择这两种类型中较小的一个(如果存在),然后将这个数字表添加到您的表中。它实际上是一个简单的过滤器。如果需要,您可以使用 WHERE 而不是 JOIN。
SELECT tbl.* FROM tbl WHERE (SELECT min(type) FROM tbl WHERE type between 1 and 2 ) = type