Mysql Join with标志不需要联接表中的关联行

Mysql Join with标志不需要联接表中的关联行,mysql,sql,join,Mysql,Sql,Join,我有表1,其中有以下列: t1\u id(主键,自动递增) 第1行 第2行 open_1可以是0或1 我有表2,其中有以下列: t1\u id(表1.t1\u id的外键) 行1可以是0或1 其他一些专栏 生成表时,如果没有为table2生成列,则table1。打开\u 1=1 因此,如果open_1为1,则在table2中没有具有相同t1_id的行,否则table2中有一行或多行具有相同的t1_id 我想检索table1.row_1,table1.row_2,其中其中一项为真: op

我有
表1
,其中有以下列:

  • t1\u id
    (主键,自动递增)
  • 第1行
  • 第2行
  • open_1
    可以是0或1
我有
表2
,其中有以下列:

  • t1\u id
    (表1.t1\u id的外键)
  • 行1
    可以是0或1
  • 其他一些专栏
生成表时,如果没有为
table2
生成列,则
table1。打开\u 1
=1

因此,如果open_1为1,则在
table2
中没有具有相同
t1_id
的行,否则
table2
中有一行或多行具有相同的
t1_id

我想检索
table1.row_1,table1.row_2
,其中其中一项为真:

  • open_1
    为1,或
  • 表2.第1行
    为1
我试过这个:

SELECT table1.row_1, table1.row_2 
FROM table1
JOIN table2
    ON table1.t1_id = table2.t1_id
WHERE table1.open_1 = 1
    OR table2.row_1 = 1
但是当
open\u 1
为1时,它不会返回结果

我认为这是因为当
open\u 1
=1时,
table2
中没有关联的行,因此JOIN子句不会检索任何行

如果我做两个查询,我可以很容易地完成(首先检索open_1为1的行,然后检索
table1.t1_id
=
table2.t1_id
)的行),但我想在一个查询中完成

我可以用一个查询来完成这项工作吗

数据:

表1:

我的问题是无法检索第一行(其中open_1=1),因为第二个表中没有对应的行。因此,如果open_1=1,我需要一种方法来添加这一行,而不考虑连接

使用左连接

  Select  distinct t1.row_1,t1.row_2 from table1  t1
      left join table2 t2 on
     t1.t1_id=t2.t1_id  where t1.open_1=1 or t2.row_1=1
使用左连接

  Select  distinct t1.row_1,t1.row_2 from table1  t1
      left join table2 t2 on
     t1.t1_id=t2.t1_id  where t1.open_1=1 or t2.row_1=1

您可以使用联合子句:

select table1.row_1, table1.row_2 
FROM table1 where table1.open_1 = 1
UNION
SELECT table1.row_1, table1.row_2 
FROM table1
JOIN table2
ON table1.t1_id = table2.t1_id
WHERE table2.row_1 = 1

您可以使用联合子句:

select table1.row_1, table1.row_2 
FROM table1 where table1.open_1 = 1
UNION
SELECT table1.row_1, table1.row_2 
FROM table1
JOIN table2
ON table1.t1_id = table2.t1_id
WHERE table2.row_1 = 1
你需要一个

你需要一个


请保留一些预期结果的数据样本。@JERRY我添加了它。为什么您将列称为“row_x”?-造成混乱的秘诀。我看到三次出现的值为1的行_1,为什么您只指出其中的两个?请保留一些数据样本以获得预期结果。@JERRY我添加了它为什么您将列称为“行_x”?-造成混乱的秘诀。我看到三次出现的行_1的值为1,为什么您只指出其中的两次?就个人而言,我会先使用左连接方法,但此解决方案在性能调整方面可能有一些优点-我经常看到DBA将“where x=y或a=b”查询重写为“where x=y union where a=b”对于表演来说,盖尼特也更容易理解。我是一个初学者,我知道左连接,但我不能让它工作。当我看到这个联合的例子时,我理解了如何解决它,并在大约15秒钟内使它工作。我个人会先使用左连接方法,但这个解决方案在性能调整方面可能有一些优点-我经常看到DBA将“where x=y或a=b”查询重写为“where x=y联合where a=b”对于表演来说,盖尼特也更容易理解。我是一个初学者,我知道左连接,但我不能让它工作。当我看到这个联合的例子时,我理解了如何解决它,并在大约15秒钟内使它工作。旁注,从给出的数据来看,我相信这个查询将返回一个额外的重复行,而该行在问题中所需的结果集中不存在。当前接受的答案中的union运算符可能会从给定的数据中隐藏此行边注释。我相信此查询将返回一个额外的重复行,而该行在问题的所需结果集中不存在。当前接受答案中的union运算符可能隐藏了此行
select table1.row_1, table1.row_2 
FROM table1 where table1.open_1 = 1
UNION
SELECT table1.row_1, table1.row_2 
FROM table1
JOIN table2
ON table1.t1_id = table2.t1_id
WHERE table2.row_1 = 1
SELECT table1.row_1, table1.row_2 
FROM table1
LEFT JOIN table2
    ON table1.t1_id = table2.t1_id
WHERE table1.open_1 = 1
    OR table2.row_1 = 1