在多个表中跳过内部连接mysql查询

问题描述:

我构建了一个包含几个内部连接作为“条件”(而不是使用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

假设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