带或不带条件的Mysql联接表

带或不带条件的Mysql联接表,mysql,join,Mysql,Join,我有一个问题,我最近一直有很多,这将是伟大的找到一个解决方案。 假设我们有两个表Table1和Table2。有没有一种方法可以在有条件或没有条件的情况下对这些表进行联接 e、 g: 所以在这两种情况下,我希望能够进行连接,如果我在t2列上指出一个条件,那么它将显示与之相关的结果,否则会显示所有内容 现在,如果我把放在(“”)中,它不会显示任何内容 提前感谢。当您执行左连接时,第二个表中的条件会出现在on子句中: Select * from Table1 t1 left join Tab

我有一个问题,我最近一直有很多,这将是伟大的找到一个解决方案。 假设我们有两个表
Table1
Table2
。有没有一种方法可以在有条件或没有条件的情况下对这些表进行
联接

e、 g:

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

现在,如果我把
放在(“”)
中,它不会显示任何内容


提前感谢。

当您执行
左连接时,第二个表中的条件会出现在
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
保留第一个表中的所有行,不管
on
子句的计算结果是否为true。因此,第一个表上的条件对结果没有影响(因为
left join
仍然保留第一条记录)


另一方面,您的版本将
左连接
转换为
内部连接
,因为当
where
子句处理它们时,第二个表上的值是
NULL

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


此处提供了一个图形解释:

MySQL处理查询的过程是,它首先执行From子句,该子句是您的左连接,然后在指定的列上执行where子句,然后根据select子句中选择的列生成结果集

(问)现在如果我把它放在('')里面,它什么也看不出来。 原因它将查找您在where子句中指定的列,并查找该列是否包含“”,如果是,则将显示结果,如果不是零行

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,则将返回所有字段,否则将返回筛选字段。

如果我也在(“”)中输入,那么已经这样做了,它不会显示任何内容我想要的是,如果我输入一个值,我只会得到与该条件相关的记录,而不是像内部联接那样的记录,如果我不输入,我得到的一切都不重要我知道内部联接是什么,谢谢,但这并不能解决我的问题,如果你在“in”中输入空值,它不会显示任何内容供尝试使用,但这仍然不是我想要的,如果我在@input中输入null,它会给出所有正确的结果,但是如果我输入一个值,我会得到一个记录,该值加上null值,这是由左连接ofc引起的,我只需要一个特定的记录,该值有什么特殊的原因不在这个查询中使用内部连接?一些记录没有映射,所以我想在出现时也显示它们没有输入,如果我将其放入内部,它们将不会出现如果您添加一个条件where子句,请从表1中选择*t1左连接表2 t2 on t1.column=t2.column和t2.anothercolumn in(coalesce(@input,t2.anothercolumn))和。。。;其中不为NULL或@value为NULL
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
;