基本上我有这个问题:
( SELECT * FROM tbl WHERE type = 'word1' )
UNION
( SELECT * FROM tbl WHERE type = 'word2' ) // Run this query if there are no results with type = 1
基本上我只想在第一个查询没有任何结果的情况下运行第二个查询。有可能吗?
答案 0 :(得分:1)
FIRST“PreCheck”查询计算类型= 1的记录数量。在此之后,如果计数大于1,则返回1,否则返回2.
现在,这个答案可以用在连接中(通过COUNT(*)始终是一行),它将具有1或2的值。这个值将是第二个值是EQUALITY条件。因此,如果条目为1,则结果将如同
WHERE1 = 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
如果“类型”列上有索引,则第一个查询应该几乎是即时的。
答案 1 :(得分:0)
你可以写
select * from tbl
where type = 1
union
select * from tbl
where type = 2
and not exists( select * from tble where type = 1 )
但这可能不会像在你的程序中那样表现得好
答案 2 :(得分:0)
它可以解决问题:
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