该查询将从 CompanyListings 中选择所有记录,其中 CompanyZip 列中的邮政编码至少在 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");
最佳答案
您最好创建新表来存储公司 ID 和关联的每个邮政编码。对城市也做同样的事情。之后,您可以通过适当的索引有效地使用 IN。
如果您必须对现有数据执行此操作,则需要创建一个小函数,该函数接受两个邮政编码字符串,当其中存在任何匹配的邮政编码时返回 true。然后您可以使用如下函数连接两个表:
Select * from companylist c left join citylist t on match_zips(c.zips,t.zips)>0
速度会很慢。
关于mysql - SQL 值列表中的一个值在列表中至少出现一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30289407/