在MYSQL中加入并缺少行

Jul*_*oux 0 mysql sql join

我有一个像这样的查询:

SELECT DISTINCT 
      `a`.*,
      `b`.*,
      `c`.*      
FROM `a`     
INNER JOIN `b` ON (`b`.`a_id` = `a`.`id` )     
INNER JOIN `c` ON (`c`.`id` = `b`.`c_id`)       
WHERE (
  (`a`.`id` = 12345) AND
  (`b`.`foo`= "bar")
)
Run Code Online (Sandbox Code Playgroud)

基本上,这将从a = id = 12345获取行,并且b中涉及此行的行,以及来自c的关于此b行的行,仅b中的行具有foo = bar

现在,如果没有b行有foo = bar,则甚至不返回a行.这是错的.无论匹配哪一行返回(无论是否有bs和cs),我都希望这样.我怎样才能做到这一点?(有办法吗?)

MJB*_*MJB 6

我想你应该查看如何做OUTER JOINS.听起来这可能就是你所要求的.

就像是:

SELECT DISTINCT 
  `a`.*,
  `b`.*,
  `c`.*
FROM `a` 
LEFT OUTER JOIN 
  `b` ON `b`.`a_id` = `a`.`id`
LEFT OUTER JOIN  
  `c` ON `c`.`id` = `b`.`c_id`
WHERE 
  `a`.`id` = 12345
Run Code Online (Sandbox Code Playgroud)

编辑:使用新信息(b上的条件,必须有一个列foo = bar.这在b中根本没有行时有效.但如果有一个foo = notbar,我希望它返回一个as好吧),试试这个.注意:我删除了抽搐,以便于阅读和查看引号.

SELECT DISTINCT 
  a.*,
  b.*,
  c.*
FROM a 
LEFT OUTER JOIN 
  b ON b.a_id = a.id and b.foo = 'bar'
LEFT OUTER JOIN  
  c ON c.id = b.c_id
WHERE 
  a.id = 12345
Run Code Online (Sandbox Code Playgroud)