【问题标题】:MySQL lookup joining 3 tablesMySQL 查找加入 3 个表
【发布时间】:2013-08-23 14:29:17
【问题描述】:

我有 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     |
+----+-------------+------+---------+

我希望我已经解释得足够好,但如果我需要添加更多细节,请告诉我。

非常感谢您对此的指导,在此先感谢 :)

【问题讨论】:

  • 是否排除代码在排除表中的行,或者如果代码存在于排除表中,您是否希望位置为空?
  • 您好索南,感谢您的回复。我需要排除行和 Geoffrey 建议在我的 AND 中使用 NOT IN 的建议:) 快乐的日子。

标签: php mysql sql left-join


【解决方案1】:

我认为您使用“NOT IN”。

所以你的“AND”会更像

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

【讨论】:

  • 根据stackoverflow.com/a/3083665/2237306 我想NOT IN 可能不是要走的路。
  • 嗨 Geoffrey,感谢您对此的帮助 :) 我已经按照您的建议测试了 NOT IN,现在它似乎工作正常,即使您链接到的帖子表明 NOT IN 不是要走的路。非常感谢,过去 2 小时我一直在处理这个问题,先生,您是救生员。
猜你喜欢
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
相关资源
最近更新 更多