2013-02-17 66 views
0

我構建了一個包含幾個內部連接作爲「條件」(而不是使用WHERE子句)的大型腳本。作爲一個樣本:在多個表中跳過內部連接mysql查詢

SELECT T1.* 
FROM Table1 T1 
    INNER JOIN Table2 T2 
     ON T1.id = T2.id 
    INNER JOIN Table3 T3 
     ON T2.id = T3.id 
    INNER JOIN Table4 T4 
     ON T1.id = T4.id 

等等

在我需要跳過一個或多個內部連接一定的條件。 到目前爲止,我不得不復制腳本註釋掉我不需要的連接。 是否有任何方式使用變量或IF子句跳過一個連接,或至少是「全選」方式?

+0

在什麼條件下你需要跳過一些連接,例如? – Axarydax 2013-02-17 10:49:15

+0

使用左外連接,然後控制where子句中的條件。性能較差,但給你更多的控制權。 – muhmud 2013-02-17 10:57:33

+0

@Axarydax無論根據腳本變量的情況如何。類似於(在bash中)「如果$ VAR =」是「,那麼......」 – 2013-02-17 11:04:27

回答

1

假設PHP:

$SQL = " 
SELECT T1.* 
FROM Table1 T1 
    INNER JOIN Table2 T2 
     ON T1.id = T2.id" . ($variable1 == x ? " OR TRUE=TRUE" : "") . " 
    INNER JOIN Table3 T3 
     ON T2.id = T3.id" . ($variable2 == y ? " OR TRUE=TRUE" : "") . " 
    INNER JOIN Table4 T4 
     ON T1.id = T4.id" . ($variable3 == z ? " OR TRUE=TRUE" : "") 

但我敢肯定,你倒​​是應該動態地構建查詢:

$SQL = " 
SELECT T1.* 
FROM Table1 T1"; 

if ($variable1 == x) { 
    $SQL .= " INNER JOIN Table2 T2 ON T1.id = T2.id"; 
} 

if ($variable2 == y) { 
    $SQL .= " INNER JOIN Table3 T3 ON T2.id = T3.id"; 
} 

if ($variable3 == z) { 
    $SQL .= " INNER JOIN Table4 T4 ON T3.id = T4.id"; 
} 

與所有的連接等。

+0

這是我正在尋找的一種想法,雖然不幸的是我使用bash不能照原樣應用。我期待着一種編碼查詢本身的方式,而不是用來運行它的語言。謝謝! – 2013-02-17 17:24:19

+0

我想你可以希望bash,即使有用戶輸入,但我不夠好,以幫助你在這一個! – Sebas 2013-02-17 17:25:50