在MySQL中将3个表链接在一起

时间:2013-01-05 17:12:33

标签: mysql

我正在尝试通过一个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和表1中获取数据? 2,在不使用两个请求的情况下让table3的字段为空?

2 个答案:

答案 0 :(得分:2)

您应该更改请求以使用LEFT JOIN而不是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会生成一组数据。即使LEFT JOINtable1中没有记录,table2也会返回table3的记录。

如果您需要帮助学习加入语法,这里有一个很棒的visual explanation of joins

答案 1 :(得分: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"