1

基本上我有这个查询:

( SELECT * FROM tbl WHERE type = 'word1' )
  UNION
( SELECT * FROM tbl WHERE type = 'word2' ) // Run this query if there are no results with type = 1

基本上我只想在第一个没有任何结果的情况下运行第二个查询。是否可以?

4

3 回答 3

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

如果“类型”列上有索引,则第一个查询应该几乎是瞬时的。

于 2012-04-28T01:22:22.410 回答
0

你可以写

select * from tbl 
where type = 1 
union 
select * from tbl 
where type = 2 
and not exists( select * from tble where type = 1 )

但这可能不会像在您的程序中那样执行

于 2012-04-28T01:02:54.893 回答
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
于 2012-04-28T01:03:45.863 回答