0

我正在尝试通过一个 MySQL 请求将 3 个数据库表链接在一起。

数据库结构:

表格1 :

  • table1_id(示例:1)
  • table1_name(例如:hello world)

表2:

  • table2_id(例如:空)
  • table2_name(例如:空)

表3 :

  • table3_id(示例:1)
  • table3_name(例如:random_name

MySQL 请求

SELECT * FROM table1 AS a, table2 AS b, table3 AS c 
WHERE a.table1_id = b.table2_id 
 AND a.table1_id = c.table3_id AND table3_name = "random-name"

问题

上一个请求不会显示任何结果,因为table2它是空的。你知道我如何从表 1 和 2 中获取数据,让table3's 字段为空而不使用两个请求吗?

4

2 回答 2

2

您应该更改您的请求以使用 aLEFT JOIN而不是 a INNER JOIN

select *
from table1 t1
left join table2 t2
  on t1.table1_id = t2.table2_id
left join table3 t3
  on t1.table1_id = t3.table2_id
  and t3.table3_name = 'random-name'

如果 id 存在于所有表中,INNER JOIN则生成一组数据。即使or中没有记录,LEFT JOIN也会返回记录。table1table2table3

如果您在学习连接语法方面需要帮助,这里有一个很好的连接可视化解释

于 2013-01-05T17:15:50.663 回答
0

夫妻心得:

  • 不要使用SELECT *,明确命名列
  • 不要使用隐式连接语法;使用ON从句
  • 要保留在连接条件上不“匹配”的行,请使用LEFT OUTER JOIN

因此,试试这个:

SELECT  a.table1_id, a.table1_name
      , b.table2_id, b.table2_name
      , c.table3_id, c.table3_name 
FROM   table1 AS a
LEFT OUTER JOIN table2 AS b
ON     b.table2_id = a.table1_id
JOIN table3 AS c
ON     c.table3_id = a.table1_id 
WHERE  c.table3_name = "random-name"
于 2013-01-05T17:23:19.527 回答