加入三张桌子

Had*_*onk 17 mysql sql database

我试图检索两组信息(一个查询中的图表的红色和蓝色部分.

我以为我可以使用如下所述的sql来做它但是当TableC没有记录时它不会返回任何东西.如果TableC没有记录,我仍然希望此查询返回BLUE区域指示的结果.

SELECT A.*FROM TableA A.

JOIN TableB B ON(A.id = B.a_id)

JOIN TableC C ON(A.id = C.a_id)

感谢任何指针,以返回红色和/或蓝色段.在此先感谢=]

Ior*_*nev 21

尝试这样的事情

SELECT A.* FROM TableA A
LEFT OUTER JOIN TableB B ON (A.id = B.a_id)
LEFT OUTER JOIN TableC C ON (A.id = C.a_id)
WHERE B.a_id IS NOT NULL 
  OR c.a_id IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

  • +1 - 看起来不错,除了"TableC C"和"(A.id"之间缺少"ON" (3认同)

Ana*_*nax 10

要理解为什么在TableC没有记录时没有得到任何结果,你需要在SQL中学习一些关于JOIN类型的知识.

基本上,当您发出查询时

TableA A JOIN TableB B ON A.id = B.a_id
Run Code Online (Sandbox Code Playgroud)

您告诉数据库查看两者TableATableB获取满足连接谓词的所有行对(A.id = B.a_id).因此,如果TableB为空,则数据库无法找到具有前述条件的行和.

这种类型的JOIN称为INNER JOIN,它是最常用的连接操作类型.

在你的情况下,如果存在这样的行,你想要从中获取所有TableA X TableB和所有相关的TableC(基于连接预测"A.id = C.a_id".这是OUTER JOIN的情况.两种最常见的类型这种连接的是LEFT JOIN(包括左表中的所有行)和RIGHT JOIN(包括右表中的所有行).

在这种情况下,您的查询应该是:

SELECT A.*
FROM
  (TableA A JOIN Table B B ON A.id = B.a_id)
  LEFT JOIN TableC C ON A.id = C.a_ID
Run Code Online (Sandbox Code Playgroud)

如果您想了解有关SQL中连接类型的更多信息,我建议您查看相关的Wikipedia页面

编辑

按照同样的逻辑,如果你想拥有的所有行TableA,只有从表中的相关行TableBTableC(如果有的话),你的查询将变成:

SELECT A.*
FROM
  (TableA A LEFT JOIN Table B B ON A.id = B.a_id)
  LEFT JOIN TableC C ON A.id = C.a_ID
Run Code Online (Sandbox Code Playgroud)