Mysql 如何选择一个字段在多个字段中的行

Mysql 如何选择一个字段在多个字段中的行,mysql,sql,Mysql,Sql,我正在尝试查询我的数据库,以返回与输入的邮政编码匹配的所有建筑物。我的客户向我提供了两张与该主题相关的表格: buildings +----+------------+---------------+ | id | name | building_code | +----+------------+---------------+ | 1 | Building A | 001 | | 2 | Building B |

我正在尝试查询我的数据库,以返回与输入的邮政编码匹配的所有建筑物。我的客户向我提供了两张与该主题相关的表格:

             buildings
+----+------------+---------------+
| id |    name    | building_code |
+----+------------+---------------+
|  1 | Building A |           001 |
|  2 | Building B |           002 |
|  3 | Building C |           003 |
+----+------------+---------------+

             postal_codes
+----+-------------+---------+-----------+
| id | postal_code | primary | pecondary |
+----+-------------+---------+-----------+
|  1 |   A1A 1A1   |     001 |       002 |
|  2 |   B2B 2B2   |     002 |       003 |
|  3 |   C3C 3C3   |     003 |       001 |
+----+-------------+---------+-----------+
不幸的是,包含邮政编码的表包含重复的建筑编码。邮政编码有一个主建筑和一个辅助建筑

因此,在搜索邮政编码为A1A的建筑物时,我需要接收a栋和B栋。这本身并不是什么大问题,但我发现唯一的方法是难以置信的庞大,并且没有为将来的校对留下很多选择

SELECT * FROM buildings
WHERE (building_code IN  (SELECT primary FROM postal_codes
                          WHERE postal_code LIKE '%A1A%')
       OR
       building_code IN  (SELECT secondary FROM postal_codes
                          WHERE postal_code LIKE '%A1A%'))
我试着用邮政编码选择主、辅代码进行构建,但这会不断导致错误。

您可以使用JOIN

注意:使用Distinct避免生成表中的重复记录,因为原始记录不会重复结果。如果您的邮政编码表在pc.primary或pc.secondary列中没有重复条目,则可以删除Distinct

或者您可以使用EXISTS


您可以尝试如下方式联接表:

select b.* 
  from postal_codes p
  join buildings b
    on b.building_code = p.primary OR b.building_code = p.secondary
 where p.postal_code LIKE '%A1A%'

我尝试了你发布的第一个代码,但没有成功。我找回了整个数据库,或者至少看起来是这样,可能有很多重复的行。但是,您发布的第二个查询非常有效,如果客户希望按照邮政编码修建三级建筑,则更新该查询将非常简单。尽管该代码可能有助于解决问题,但它没有解释为什么和/或如何回答该问题。提供这种额外的环境将大大提高其长期教育价值。请在回答中添加解释,包括适用的限制和假设。
SELECT * 
FROM   buildings B 
WHERE  EXISTS (SELECT 1 
               FROM   postal_codes PC 
               WHERE  B.building_code IN ( pc.primary, pc.secondary ) 
                      AND PC.postal_code LIKE '%A1A%') 
select b.* 
  from postal_codes p
  join buildings b
    on b.building_code = p.primary OR b.building_code = p.secondary
 where p.postal_code LIKE '%A1A%'
SELECT b.*
FROM
(
SELECT primary as b_id FROM postal_codes WHERE postal_code LIKE '%A1A%'
UNION DISTINCT
SELECT pecondary as b_id FROM postal_codes WHERE postal_code LIKE '%A1A%'
) x
inner join buildings as b on x.b_id = b.building_code