基本上我有这个疑问:如果前面的查询至少有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
基本上我想运行仅在第一还没有任何结果的第二个查询。可能吗?
基本上我有这个疑问:如果前面的查询至少有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
基本上我想运行仅在第一还没有任何结果的第二个查询。可能吗?
第一“预检”查询确实的类型的多少条记录= 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
如果在“类型”列的索引,第一个查询应该几乎是瞬间的。
这很聪明。我会在您的第一个子查询中包含一个LIMIT 1,以便更快 – dynamic 2012-04-28 09:32:15
你可以写
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
如何有两个查询,并决定你是否需要第二个在你的程序? – Thilo 2012-04-28 00:45:08
@Thilo:我现在这样做......但这很不好 – dynamic 2012-04-28 00:45:35
这是怎么回事?如果大多数情况下第一个查询返回一些数据,应该表现得更好。 – Thilo 2012-04-28 00:47:30