值列表中的SQL一个值在列表中至少出现一次

时间:2015-05-17 16:43:32

标签: mysql sql

查询是从CompanyListings中选择所有记录,其中CompanyZo列中的至少一个邮政编码在CityToZipCodes表的ZipCodes列中出现一次。 ZipCodes和CompanyZip列都是TEXT数据类型,所有值都将以逗号分隔的数字列表。

CityToZipCodes
+----+---------+-----------------------------------+
| ID | City    | ZipCodes                          -
+----+---------+-----------------------------------+
|  1 | Atlanta | 30028, 30040, 30041, 30107, 30151 -
+----+---------+-----------------------------------+

CompanyListings
+-----+-------------------+----------------------+
| ID  | CompanyName       | CompanyZip           -
+-----+-------------------+----------------------+
|  11 | BBB HVAC Company  | 30028, 30188, 30107  -
|  12 | Americool         | 30520, 30151, 30041  -
+-----+-------------------+----------------------+

我根据其他SO问题使用LIKE和IN尝试了一些查询,但是当两个表列值都是逗号分隔列表时它们不起作用。

SELECT * 
FROM CompanyListings
WHERE CompanyZip IN (SELECT ZipCodes
FROM CityToZipCodes
WHERE City = "Atlanta");

1 个答案:

答案 0 :(得分:0)

您最好创建新表来存储公司ID和每个邮政编码相关联。对城市也这样做。在此之后,您可以使用适当的索引有效地使用IN。

如果必须对现有数据执行此操作,则需要创建一个小函数,该函数接受两个邮政编码字符串,如果其中包含任何匹配的邮政编码,则返回true。然后你可以使用如下函数加入这两个表:

 Select * from companylist c left join citylist t on match_zips(c.zips,t.zips)>0

这将非常缓慢。