2012-04-28 46 views
1

基本上我有这个疑问:如果前面的查询至少有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 

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

+0

如何有两个查询,并决定你是否需要第二个在你的程序? – Thilo 2012-04-28 00:45:08

+0

@Thilo:我现在这样做......但这很不好 – dynamic 2012-04-28 00:45:35

+0

这是怎么回事?如果大多数情况下第一个查询返回一些数据,应该表现得更好。 – Thilo 2012-04-28 00:47:30

回答

1

第一“预检”查询确实的类型的多少条记录= 1。在此之后,如果计数大于1的数,则返回1,否则返回2.

现在,这个答案可以在连接中使用(它总是通过COUNT(*)单行),它将有1或2的值。那个价值将是第二个价值是平等的条件。所以,如果存在的1的条目,则结果将是仿佛

WHERE t1.Type = 1

因此从未允许在测试的任何2。然而,如果没有找到条目,则其值为2,并因此产生的

WHERE子句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 

如果在“类型”列的索引,第一个查询应该几乎是瞬间的。

+0

这很聪明。我会在您的第一个子查询中包含一个LIMIT 1,以便更快 – dynamic 2012-04-28 09:32:15

0

你可以写

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

,但这可能不会执行,以及只是在做它在你的程序

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