0

你好。任何人都可以简化这个mysql select语句的where条件吗?带来结果需要很长时间,或者它要求SET SQL_BIG_SELECTS=1

在下面的查询中:

邮政编码包含BH12或SW10等值

*req_area* 包含Kensington and Chelsea, SW10等数据,

地区具有肯辛顿和切尔西等价值观,

*town_area* 具有West Brompton, Chelsea等值。

select `a`.`user_id` AS `user_id`,`a`.`req_area` AS `req_area`,`a`.`req_area2` AS `req_area2`,`a`.`req_area3` AS `req_area3`,
`a`.`req_property_type` AS `req_property_type`,`a`.`req_bedrooms` AS `req_bedrooms`,`b`.`latitude` AS `latitude`,
`b`.`longitude` AS `longitude`,`b`.`postcode` AS `postcode`
from (`cff_user_property_req_view` `a` join `cff_uk_short_postcodes` `b`) 
where 
(`b`.`postcode` regexp concat("'",TRIM(`a`.`req_area`),'|',TRIM(`a`.`req_area2`),'|',TRIM(`a`.`req_area3`),"'")>=1 or 
`b`.`region` regexp concat("'",TRIM(`a`.`req_area`),'|',TRIM(`a`.`req_area2`),'|',TRIM(`a`.`req_area3`),"'")>=1 or 
`b`.`town_area` regexp concat("'",concat('[[:<:]]',`a`.`req_area`,'[[:>:]]'),'|',concat('[[:<:]]',`a`.`req_area2`,'[[:>:]]'),'|',concat('[[:<:]]',`a`.`req_area3`,'[[:>:]]'),"'")>=1) 
order by `a`.`user_id`;

提前致谢。

4

1 回答 1

1

之所以这么慢,是因为您的代码需要对两个表的整个外积计算三个正则表达式。正则表达式很慢,任何必须遍历整个表才能找到匹配行的东西也很慢。在保留您给出的查询的确切语义的同时,您几乎无能为力。

因此,与其寻求改进该查询的方法,不如描述您想要实现的目标,然后找到一种以更好的方式对其进行建模的方法。全文搜索索引可能会有所帮助。将列拆分为单词并将这些单词存储在额外的表中可能会有所帮助。我不确定是编辑您的问题,还是将这个问题保持原样,并为此提出一个全新的问题是否会更好。

您可能还应该举例说明req_area在您期望匹配的情况下应该是什么样子。由于req_area字段始终包含在正则表达式中,因此您的示例不会产生匹配项,因为req_area“Kensington and Chelsea, SW10”这一长句不包含在您示例中的任何其他值中。使用sqlfiddle提供一些实际示例将使其他人更容易尝试可能的查询,从而提高您收到的答案的质量(因为实际上已经检查了查询)和收到任何答案的机会(因为人们可以继续通过实验得出他们的答案)。

于 2012-08-09T14:31:22.227 回答