如果先前查询至少有1个结果,请不要返回任何结果?

时间:2012-04-28 00:43:23

标签: mysql sql

基本上我有这个问题:

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

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

3 个答案:

答案 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