MySQL查找连接3个表

时间:2013-08-23 14:29:18

标签: php mysql sql left-join

我有3个表,位置,查找和排除以及以下信息......

位置表

+----+--------------+
| id | location     |
+----+--------------+
| 1  | Location a   |
| 2  | Location b   |
| 3  | Location c   |
| 5  | Location d   |
| 6  | Location e   |
| 7  | Location f   |
| 8  | Location g   |
| 9  | Location h   |
+----+--------------+

查找表

+----+-------------+------+
| id | location_id | code |
+----+-------------+------+
| 1  | 2           | PR6  |
| 2  | 2           | PR7  |
| 3  | 2           | PR9  |
| 4  | 5           | WA2  |
| 6  | 8           | WA3  |
+----+-------------+------+

排除表格

+----+-------------+------+
| id | location_id | code |
+----+-------------+------+
| 1  | 2           | PR5  |
| 2  | 2           | PR8  |
+----+-------------+------+

这些表存在基本的邮政编码查找。我需要创建一些SQL,以便可以使用邮政编码进行搜索,但我需要考虑任何被排除的邮政编码,例如......如果我要搜索“PR7”,我会得到“位置B”作为结果但如果我要搜索PR5或PR8,我就不会得到“位置B”,因为它们在排除表中。这是我到目前为止所拥有的......

SELECT
lookup.*, exclude.`code` as exclude, location.location
FROM lookup
LEFT JOIN
exclude
ON lookup.location_id = exclude.location_id
LEFT JOIN
location
ON location.location = lookup.location_id
WHERE lookup.`code` LIKE 'PR%' AND (exclude.`code` NOT LIKE 'PR8%' OR ISNULL(exclude.`code`))
GROUP BY location.location
ORDER BY location.id

在上面的SQL中,用户键入“PR8”,使用PHP变量发送到where子句,我在查找表中查找邮政编码的前2个字母,然后我也在寻找什么用户在排除表中输入以从结果中省略它。不幸的是,我无法告诉我哪里出错了,我得到了以下结果,根据上面的表格,由于排除,我应该没有结果......

+----+-------------+------+---------+
| id | location    | code | exclude |
+----+-------------+------+---------+
| 1  | Location b  | PR8  | PR5     |
+----+-------------+------+---------+

我希望我已经解释得这么好,但请告诉我是否需要添加更多细节。

我真的很感激这方面的一些指导,非常感谢提前:)

2 个答案:

答案 0 :(得分:0)

看到这可能会对你有所帮助

SQL中的三个表JOIN语法 这是一个连接三个或更多表的通用SQL查询语法。此SQL查询应该适用于所有主要关系数据库,例如MySQL,Oracle,Microsoft SQLServer,Sybase和PostgreSQL:

SELECT t1.col, t3.col FROM table1 join table2 ON table1.primarykey = table2.foreignkey
                                  join table3 ON table2.primarykey = table3.foreignkey

see more details here

答案 1 :(得分:0)

我认为你使用“NOT IN”。

所以你的“和”更像是

AND lookup.`code` NOT IN (SELECT 'code' FROM exclude)

EDIT 我很确定这会有效,不确定最佳表现,我会把它留给聪明的人而不是我。

SELECT
lookup.*, location.location
FROM lookup
LEFT JOIN
location
ON location.id = lookup.location_id
WHERE lookup.`code` LIKE 'PR%' 
AND lookup.`code` NOT IN (SELECT `code` FROM exclude) 
GROUP BY location.location
ORDER BY location.id