查询是从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");
答案 0 :(得分:0)
您最好创建新表来存储公司ID和每个邮政编码相关联。对城市也这样做。在此之后,您可以使用适当的索引有效地使用IN。
如果必须对现有数据执行此操作,则需要创建一个小函数,该函数接受两个邮政编码字符串,如果其中包含任何匹配的邮政编码,则返回true。然后你可以使用如下函数加入这两个表:
Select * from companylist c left join citylist t on match_zips(c.zips,t.zips)>0
这将非常缓慢。