我有一个像这样的查询:
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),我都希望这样.我怎样才能做到这一点?(有办法吗?)
我想你应该查看如何做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)
| 归档时间: |
|
| 查看次数: |
715 次 |
| 最近记录: |