2012-04-28 45 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