2013-03-26 135 views
0

我有3个表我想加入。MySQL有两个连接和Where子句

OFFICE包含办公地址/联系方式。 CRIMECAT包含办公室可能涉及的各类犯罪法,并通过'f_id'与OFFICE表相关联 CIVILCAT包含办公室可能涉及的民事法类别,并通过'f_id'与OFFICE表相关联。以及。

一个办公室可能会处理犯罪法,民法等类别,无论是否有。

用户放入一个位置,并通过一系列复选框决定他们在搜索前感兴趣的法律领域。然后应该返回处理该地点任何检查类别的办公地址列表。

这适用于犯罪类别或民事类别,但只要选择一个或多个选项,查询就会返回零结果。

查询的工作方式如下:

SELECT DISTINCT OF.f_id, OF.acc, OF.add1, OF.add2, OF.add3, OF.city, OF.pc, OF.tel 
FROM office OF 
JOIN crimecat CR ON OF.f_id=CR.f_id 
WHERE OF.id ='3946' AND CR.cat = 'crm' 

我敲我的头撞墙上是查询:

SELECT DISTINCT OF.f_id, OF.acc, OF.add1, OF.add2, OF.add3, OF.city, OF.pc, OF.tel 
FROM office OF 
JOIN crimecat CR ON OF.f_id=CR.f_id 
JOIN civilcat CI ON OF.f_id=CI.f_id 
WHERE OF.id ='3946' AND ((CR.cat = 'crm') OR (CI.cat = 'aap')) 

我也用一个变种试图的WHERE子句也返回零:

WHERE (OF.id ='3946' AND CR.cat = 'crm') OR (OF.id ='3946' AND CI.cat = 'aap') 

我开始认为问题是与JOIN(s)rath呃比WHERE子句更好,但是想不出更好的写作方式。

+0

所有的办公室都会在CR和CI表中都有相关记录吗?我问,因为您指定的连接只会在这种情况下返回办公室记录。 – 2013-03-26 17:49:58

+0

不,他们可能有一个相关的记录,一个或两个都没有。 – 2013-03-26 17:53:41

+0

查看下面David Chan发布的答案,它应该给你你想要的东西,并且是我的问题所在。 – 2013-03-26 17:54:42

回答

1

这样的事情可能会有所帮助。我怀疑你正在寻找,但你同时要求

SELECT DISTINCT OF.f_id, OF.acc, OF.add1, OF.add2, OF.add3, OF.city, OF.pc, OF.tel 
FROM office OF 
LEFT JOIN crimecat CR ON OF.f_id=CR.f_id 
LEFT JOIN civilcat CI ON OF.f_id=CI.f_id 
WHERE OF.id ='3946' AND ((CR.cat = 'crm') OR (CI.cat = 'aap')) 
+0

宾果!看起来我的问题毕竟是JOINS,我需要阅读LEFT JOIN的黑暗艺术。我将浏览网络来满足我的好奇心,但是如果你有一个关于JOIN和LEFT JOIN(或任何其他类型!)区别的定义,我会很感激。感谢您的答案btw。 – 2013-03-26 17:57:02

+0

当您进行连接时,只返回满足双方ON条件的行。使用左连接时,JOIN语句左侧的所有行将被包括在内,而不管是否存在匹配的右半部分。评论是不是真的有足够的空间来解释,但我希望有一点帮助。 – 2013-06-06 20:45:54