Mysql连接表有或没有条件

时间:2017-06-05 11:29:02

标签: mysql join

我有一个问题,我最近有很多问题,找到一个解决方案会很棒。 假设我们有两个表Table1Table2。有没有办法在有或没有条件的情况下对这些表格进行join

例如:

Select * from Table1 t1 left join Table2 t2 on t1.column = t2.column where t2.anothercolumn in (v1,v2,v3) and ...; 

Select * from Table1 t1 left join Table2 t2 on t1.column = t2.column where t2.anothercolumn in ('') and ....;

所以在这两种情况下,我希望能够进行联接,如果我在t2列上指出一个条件,那么它会显示与之相关的结果,否则会显示所有内容。

目前如果我放in('')它就不会显示任何内容。

提前致谢。

4 个答案:

答案 0 :(得分:0)

执行left join时, second 表中的条件会进入ON子句:

Select *
from Table1 t1 left join
     Table2 t2
     on t1.column = t2.column and
        t2.anothercolumn in (v1, v2, v3) and ...; 

第一个表中的条件放在where子句中。这似乎是一个神秘的规则。但是如果你理解了潜在的机制,那就很有道理了。

left join保留 first 表中的所有行,无论on子句是否计算为true。因此,第一个表上的条件对结果没有影响(因为left join无论如何都保留了第一个记录。)

另一方面,您的版本将left join转换为inner join,因为当NULL子句正在处理它们时,第二个表上的值为where

答案 1 :(得分:0)

您提到的要求要求使用内部联接。 左连接将从左表中获取所有记录并从右表中匹配记录。如果要在两个表的交集上应用过滤器,请使用内连接。

此处提供了图形说明:https://www.w3schools.com/sql/sql_join.asp

答案 2 :(得分:0)

Process MySQL处理查询的第一个Do From子句是你的左连接,然后是你指定的列的where子句,而不是它根据select子句中选择的列生成结果集

(问)如果我把它放进去('')它就不会显示任何东西。 原因是它会查找您在where子句中指定的列,并查找它是否包含''如果是,那么如果不是零行显示结果

答案 3 :(得分:0)

Select *
from Table1 t1 left join
     Table2 t2
     on t1.column = t2.column and
     t2.anothercolumn in (coalesce (@input, t2.anothercolumn)) and ...
     where t1.someColumnName is NOT NULL or @value is NULL
;

如果@input不为null,则返回所有字段,否则将返回过滤字段。