基本上我有這個疑問:如果前面的查詢至少有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