我支持的网站执行如下所示的MySQL数据库查询:
SELECT
person_per.per_ID
FROM
person_per
LEFT JOIN
person_custom
ON
person_custom.per_ID=person_per.per_ID
where
(per_City='Cathedral City') or
(per_City='Cherry Valley') or
(per_City='Coachella') or
[...and so on for several dozen cities...];
该查询应该返回居住在任何指定城市列表中的一组人员。查询是丑陋和冗长的,但它工作正常。
但是,新请求是修改查询,以便它不仅检查person_per.per_City字段,还检查person_custom.work_City字段,以便查询返回任何居住或的人。 em>适用于任何指定的城市。
这样做的天真方法是简单地将“或”子句的数量加倍,如下所示:
SELECT
person_per.per_ID
FROM
person_per
LEFT JOIN
person_custom
ON
person_custom.per_ID=person_per.per_ID
where
(per_City='Cathedral City') or
(work_City='Cathedral City') or
(per_City='Coachella') or
(work_City='Coachella') or
[...and so on for several dozen cities...];
但是如果可能的话,我想避免这样做,因为唯一比20行SQL查询包含整个城市名称列表更糟的是包含整个城市列表的40行SQL查询-names 两次。该查询将(甚至更难)编写和维护。
那么,有没有办法对这两个列的查询进行短语,以便每个城市的名称只在查询中出现一次? (我知道我可以创建一个城市名称的SQL表,但如果可能的话,我宁愿不修改应用程序的SQL表集,所以我更喜欢只修改SQL查询本身的解决方案)
答案 0 :(得分:1)
您应该使用IN
运算符来检查值是否在其他值的列表中,因此第一个查询将简化为:
SELECT person_per.per_ID
FROM person_per
LEFT JOIN person_custom USING(per_ID)
WHERE per_City IN ( 'Cathedral City', 'Cherry Valley', 'Coachella', ... )
对于第二个查询,我建议将城市列表存储在表格或变量中以减少重复。查询的表格版本如下所示:
SELECT person_per.per_ID
FROM person_per
LEFT JOIN person_custom USING(per_ID)
WHERE per_City IN ( SELECT cities_City FROM cities )
OR work_City IN ( SELECT cities_City FROM cities )
答案 1 :(得分:0)
如评论中所述,使用“in”运算符:
SELECT
person_per.per_ID
FROM
person_per
LEFT JOIN
person_custom
ON
person_custom.per_ID=person_per.per_ID
where
per_City in ('Cathedral City','Coachella', 'city1', 'city2', ...) OR
work_City in ('Cathedral City','Coachella', 'city1', 'city2', ...)
使用每种编程语言都可以很容易地构建逗号分隔的字符串,因此您不必为此做太多工作。