您如何进行多对多表外部联接?
问题描述:
我有3个表foo,foo2bar和bar. foo2bar是foo和bar之间的多对多映射.这是内容.
I have 3 tables, foo, foo2bar, and bar. foo2bar is a many to many map between foo and bar. Here are the contents.
select * from foo
+------+
| fid |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
+------+
select * from foo2bar
+------+------+
| fid | bid |
+------+------+
| 1 | 1 |
| 1 | 2 |
| 2 | 1 |
| 2 | 3 |
| 4 | 4 |
+------+------+
select * from bar
+------+-------+------+
| bid | value | zid |
+------+-------+------+
| 1 | 2 | 10 |
| 2 | 4 | 20 |
| 3 | 8 | 30 |
| 4 | 42 | 30 |
+------+-------+------+
我要请求的是,给我一个zid为30的所有fid和值的列表"
What I want to request is, "Give me a list of all the fid and values with zid of 30"
我希望所有fid都有答案,所以结果看起来像这样:
I expect an answer for all the fids, so the result would look like:
+------+--------+
| fid | value |
+------+--------+
| 1 | null |
| 2 | 8 |
| 3 | null |
| 4 | 42 |
+------+--------+
答
SELECT * FROM foo
LEFT OUTER JOIN (foo2bar JOIN bar ON (foo2bar.bid = bar.bid AND zid = 30))
USING (fid);
在MySQL 5.0.51上进行了测试.
Tested on MySQL 5.0.51.
这不是子查询,它仅使用括号指定连接的优先级.
This is not a subquery, it just uses parentheses to specify the precedence of joins.