ommitted连接是重要的。如果查看完整查询,您将看到Django从foo
表执行了两个Left Outer Joins到加入表foo_bar
和bar
表。
考虑两个foos
和两个bars
。假设foo_1
与bar_1
和bar_2
和foo_2
有关,与bars
没有任何关系。
以下带有两个左外连接的查询至少包含foo
,NULL将出现在foo_2
的栏列中,该列与bars
没有关系。
SELECT foo.id as foo_id, bar.id as bar_id
FROM foo LEFT OUTER JOIN foo_bar
ON foo_id = foo_bar.foo_id
LEFT OUTER JOIN bar
ON foo_bar.bar_id = bar.id;
+--------+--------+
| foo_id | bar_id |
+--------+--------+
| 1 | 1 |
| 1 | 2 |
| 2 | NULL |
+--------+--------+
的查询Foo.objects.get(bar__isnull=True)
与此类似,但它不会选择从吧台的事,那筛选的bar.id
是NULL
,因为我们只希望它不涉及任何bars
的foos
。
SELECT foo.id as foo_id
FROM foo LEFT OUTER JOIN foo_bar
ON foo_id = foo_bar.foo_id
LEFT OUTER JOIN bar
ON foo_bar.bar_id = bar.id
where bar_id is NULL;
+--------+
| foo_id |
+--------+
| 2 |
+--------+
谢谢!关于第二个问题,关于实现相同结果的优化查询呢?它甚至有可能吗? – orokusaki 2011-06-10 21:23:43
我对你的第二个问题没有任何建议。如果你使用Django的'syncdb'命令创建表,那么你的表应该有合适的索引,这样查询就很有效率。 – Alasdair 2011-06-14 21:01:29