我有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“,结果将得到"Location”,但如果要搜索PR5或PR8,则不会得到"Location“,因为这些位置都在排除表中。到目前为止.
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子句,我在查找表中查找邮政编码的前两个字母,然后我还试图查找用户在排除表中输入的内容,以从结果中忽略这一点。不幸的是,我不知道我在哪里出错,我得到了以下结果,根据上面的表格,由于排除,我应该没有得到任何结果。
+----+-------------+------+---------+
| id | location | code | exclude |
+----+-------------+------+---------+
| 1 | Location b | PR8 | PR5 |
+----+-------------+------+---------+
我希望我已经解释得够好了,但如果我需要补充更多细节,请告诉我。
我真的很想在这方面提供一些指导,非常感谢:)
发布于 2013-08-23 06:37:25
我想你用的是“不是IN”。
所以你的“和”更像是
AND lookup.`code` NOT IN (SELECT 'code' FROM exclude)
编辑我很确定这会工作,不确定最好的表现,我会把这个留给比我更聪明的人。
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
https://stackoverflow.com/questions/18405352
复制相似问题