2011-12-26 122 views
6

我正在試圖結合這些MySQL查詢,但沒有弄清楚它們的正確性。這裏是我希望結合得到單行sql語句的僞代碼。將同一個表的多個查詢合併到一個SQL語句中

$var1 = "abc" 
$var2 = "def" 

IF ($var1 IN (SELECT DISTINCT col1 FROM t1)) 
{ 
    SELECT colA, colB, colC FROM t1 WHERE col1 = $var1 AND col2 LIKE '%$var2%' 
} 
ELSE 
{ 
    SELECT colA, colB, ColC FROM t1 WHERE col2 LIKE %$var1% 
} 

感謝

+1

到目前爲止你有嘗試過什麼嗎? – hakre

+0

我試過了'SELECT IF('$ var1'IN(SELECT DISTINCT col1 FROM t1),(colA,colB,colC),)從t1',但我迷失在if語句的流程中 – user1115729

回答

5

首先我要說的是mjfgates可能是正確的。原來的僞代碼不是「壞」,只是因爲它需要兩步。您的SQL語句越複雜,查詢引擎可能找不到最佳計劃的機會就越大。在這種特殊情況下,這種情況不太可能,因爲我們只需要多次引用一個表,但在這些情況下總要記住一些事情。將SQL降到一個語句本身並不總是一個有價值的目標。

現在回答你的問題:

select colA,colB,colc from table1 t1 
    where 
    (
    (col1 = $var1 and col2 like '%$var2%') and 
      EXISTS (select 1 from table1 t2 where t2.col1 = $var1) 
    ) 
    or 
    (
    (col2 LIKE %$var1%) and 
      NOT EXISTS (select 1 from table1 t3 where t3.col1 = $var1) 
    ) 
+0

This Works!謝謝! – user1115729

+0

沒問題。隨時接受答案,如果它幫助你。 – TetonSig

3

我想......我不會做。這只是存儲過程和視圖的事情,每個存儲過程和視圖都有if語句。只需從最具體到最少的順序運行選擇,並返回給出行的第一個結果。

此外,我可能會在這裏看到一個錯誤。如果表中的項目col1 = $ var1,但是這些項目都沒有col2(如$ var2),會發生什麼?應該發生什麼?

+0

優秀點。我已經更新了我的回答以反映。 – TetonSig

相關問題